2009-10-23 13 views
5

Tengo un FlowDocument de WPF que tiene unos InlineUIContainers, estos son simples InlineUIContainers, que contienen un botón de estilo con texto en el Button.Content. Cuando copio el texto y InlineUIContainer que contiene el botón del FlowDocument a un TextBox, el botón no se copia.¿Cómo puedo copiar el contenido de WPF FlowDocument InlineUIContainer?

Es posible convertir de alguna manera el botón en línea o convertir el botón en texto en los datos de texto pegados. He intentado utilizar el evento FlowDocument.DataObject.Copying, pero parece que no puedo encontrar ninguna buena muestra sobre cómo usar esto o incluso si esta es la dirección correcta.

Gracias

Respuesta

12

tuve el mismo problema y logró obtener algo como lo siguiente para trabajar:

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

Por supuesto esto es muy simple - es probable que crear una subclase de botón y definir una función de interfaz como "GetCopyToClipboardText" en lugar de tener el código "cómo obtener texto desde un botón" dentro de richtextbox.

El ejemplo copia todo el texto dentro de richtextbox; sería más útil si solo la parte seleccionada del cuadro de texto se copiara en el portapapeles. This post da un ejemplo de cómo lograr eso.

Cuestiones relacionadas