2009-10-23 12 views
5

Mam WPF FlowDocument, który ma kilka InlineUIContainers, są to proste InlineUIContainers, które zawierają przycisk stylu z tekstem w Button.Content. Kiedy kopiuję tekst i InlineUIContainer zawierający przycisk z FlowDocument do TextBox, przycisk nie jest kopiowany.Jak mogę skopiować zawartość WPF FlowDocument InlineUIContainer?

Można w jakiś sposób przekonwertować przycisk wbudowany lub przekonwertować przycisk na tekst w wklejonych danych tekstowych. Próbowałem użyć zdarzenia FlowDocument.DataObject.Copying, ale nie mogę znaleźć żadnych dobrych próbek na temat korzystania z tego lub nawet jeśli jest to właściwy kierunek.

Dziękuję

Odpowiedz

12

miałem ten sam problem i udało się uzyskać coś jak następuje pracować:

public class MyRichTextBox : RichTextBox 
{ 
    public MyRichTextBox() 
     : base() 
    { 
     CommandManager.RegisterClassCommandBinding(typeof(MyRichTextBox), 
                new CommandBinding(ApplicationCommands.Copy, OnCopy, OnCanExecuteCopy)); 
    } 

    private static void OnCanExecuteCopy(object target, CanExecuteRoutedEventArgs args) 
    { 
     MyRichTextBox myRichTextBox = (MyRichTextBox)target; 
     args.CanExecute = myRichTextBox.IsEnabled && !myRichTextBox.Selection.IsEmpty; 
    } 

    private static void OnCopy(object sender, ExecutedRoutedEventArgs e) 
    { 
     MyRichTextBox myRichTextBox = (MyRichTextBox)sender; 
     Clipboard.SetText(GetInlineText(myRichTextBox)); 
     e.Handled = true; 
    } 

    private static string GetInlineText(RichTextBox myRichTextBox) 
    { 
     StringBuilder sb = new StringBuilder(); 
     foreach (Block b in myRichTextBox.Document.Blocks) 
     { 
      if (b is Paragraph) 
      { 
       foreach (Inline inline in ((Paragraph)b).Inlines) 
       { 
        if (inline is InlineUIContainer) 
        { 
         InlineUIContainer uiContainer = (InlineUIContainer)inline; 
         if (uiContainer.Child is Button) 
          sb.Append(((Button)uiContainer.Child).Content); 
        } 
        else if (inline is Run) 
        { 
         Run run = (Run)inline; 
         sb.Append(run.Text); 
        } 
       } 
      } 
     } 
     return sb.ToString(); 
    } 
} 

Oczywiście jest to bardzo proste - to prawdopodobnie utworzyć podklasę przycisk i określić funkcja interfejsu, taka jak "GetCopyToClipboardText" zamiast "jak uzyskać tekst z przycisku" - kodowanie wewnątrz richtextbox.

Przykład kopiuje cały tekst w polu richtextbox - byłoby bardziej użyteczne, gdyby tylko zaznaczona część pola tekstowego została skopiowana do schowka. This post podaje przykład tego, jak to osiągnąć.

Powiązane problemy