2009-10-23 19 views
5

J'ai un FlowFocument WPF qui a quelques InlineUIContainers, ce sont de simples InlineUIContainers, qui contiennent un bouton stylé avec du texte dans le Button.Content. Lorsque je copie le texte et InlineUIContainer contenant le bouton de FlowDocument à un TextBox, le bouton n'est pas copié.Comment puis-je copier le contenu de WPF FlowDocument InlineUIContainer?

Il est possible de convertir en quelque sorte le bouton en ligne ou de convertir le bouton en texte dans les données de texte collées. J'ai essayé d'utiliser l'événement FlowDocument.DataObject.Copying, mais je n'arrive pas à trouver de bons exemples sur la façon de l'utiliser ou même si c'est la bonne direction.

Merci

Répondre

12

J'ai eu le même problème et a réussi à obtenir quelque chose comme ce qui suit au travail:

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

Bien sûr, cela est très simpliste - vous probablement créer une sous-classe de Button et définir une interface-fonction comme "GetCopyToClipboardText" au lieu d'avoir le "comment obtenir du texte à partir d'un bouton" -code à l'intérieur de la riche zone de texte.

L'exemple copie tout le texte dans la zone de texte enrichi - il serait plus utile si seule la partie sélectionnée de la zone de texte était copiée dans le presse-papiers. This post donne un exemple de comment réaliser cela.