我该如何复制WPF FlowDocument InlineUIContainer的内容?

7
我有一个WPF FlowDocument,其中包含一些InlineUIContainers。这些是简单的InlineUIContainers,包含一个带有文本的样式化按钮。当我将文本和包含按钮的InlineUIContainer从FlowDocument复制到TextBox时,按钮不会被复制。
是否可能以某种方式转换内联按钮或将按钮转换为粘贴的文本数据中的文本。我已经尝试使用FlowDocument.DataObject.Copying事件,但似乎找不到任何关于如何使用此事件或者这是否是正确方向的好示例。
谢谢
1个回答

16

我遇到了同样的问题,最终设法让类似以下代码起作用:

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();
    }
}
当然,这很简单 - 你可能会创建一个Button子类,并定义一个名为“GetCopyToClipboardText”的接口函数,而不是在richTextBox内部编写“如何从按钮获取文本”的代码。
该示例复制了richtextbox中的所有文本 - 如果只复制所选部分到剪贴板,则更有用。此帖子提供了如何实现这一点的示例:This post

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接