2009-10-23 26 views
5

Ich habe ein WPF FlowDocument, das ein paar InlineUIContainers hat, das sind einfache InlineUIContainer, die eine formatierte Schaltfläche mit etwas Text im Button.Content enthalten. Wenn ich den Text und den InlineUIContainer, der die Schaltfläche aus dem FlowDocument enthält, in eine TextBox kopieren, wird die Schaltfläche nicht kopiert.Wie kann ich WPF FlowDocument InlineUIContainer Inhalte kopieren?

Es ist möglich, die Inline-Schaltfläche irgendwie zu konvertieren oder die Schaltfläche in Text in den eingefügten Textdaten zu konvertieren. Ich habe versucht, das FlowDocument.DataObject.Copying-Ereignis zu verwenden, aber ich kann nicht scheinen, irgendwelche guten Beispiele zu finden, wie man dieses verwendet, oder selbst wenn dies die richtige Richtung ist.

Danke

Antwort

12

ich hatte das gleiche Problem und schaffte es so etwas wie das erhalten folgenden zu arbeiten:

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(); 
    } 
} 

Natürlich ist das sehr simpel - Sie würde wahrscheinlich eine Unterklasse von Buttons erstellen und definieren eine Interface-Funktion wie "GetCopyToClipboardText" anstatt den "how to get text from a button" -Code innerhalb der Richtextbox zu haben.

Das Beispiel kopiert den gesamten Text innerhalb der Richtextbox - es wäre nützlicher, wenn nur der ausgewählte Teil der Textbox in die Zwischenablage kopiert würde. This post gibt ein Beispiel, wie das zu erreichen ist.

Verwandte Themen