2009-10-23 9 views
5

Ho un FlowDocument WPF con alcuni InlineUIContainer, sono semplici InlineUIContainer, che contengono un pulsante con un po 'di testo in Button.Content. Quando copio il testo e InlineUIContainer contenente il pulsante da FlowDocument a un TextBox, il pulsante non viene copiato.Come posso copiare i contenuti WPF FlowDocument InlineUIContainer?

È possibile in qualche modo convertire il pulsante in linea o convertire il pulsante in testo nei dati di testo incollati. Ho provato a utilizzare l'evento FlowDocument.DataObject.Copying, ma non riesco a trovare alcun buon esempio su come usarlo o anche se questa è la direzione giusta.

Grazie

risposta

12

Ho avuto lo stesso problema e siamo riusciti a ottenere qualcosa di simile al seguente al lavoro:

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

Naturalmente questo è molto semplice - si sarebbe probabilmente creare una sottoclasse di Button e definire un'interfaccia-funzione come "GetCopyToClipboardText" invece di avere il codice "come ottenere testo da un pulsante" all'interno del richtextbox.

L'esempio copia tutto il testo all'interno del richtextbox - sarebbe più utile se solo la parte selezionata della casella di testo fosse stata copiata negli appunti. This post fornisce un esempio di come farlo.

Problemi correlati