【问题标题】:How can I copy WPF FlowDocument InlineUIContainer contents?如何复制 WPF FlowDocument InlineUIContainer 内容?
【发布时间】:2010-03-05 21:36:44
【问题描述】:
我有一个 WPF FlowDocument,它有几个 InlineUIContainers,这些是简单的 InlineUIContainers,其中包含一个样式化的按钮,其中包含 Button.Content 中的一些文本。当我将包含按钮的文本和 InlineUIContainer 从 FlowDocument 复制到 TextBox 时,不会复制按钮。
可以以某种方式转换内联按钮或将按钮转换为粘贴文本数据中的文本。我已经尝试使用 FlowDocument.DataObject.Copying 事件,但我似乎找不到任何关于如何使用它的好示例,即使这是正确的方向。
谢谢
【问题讨论】:
标签:
wpf
flowdocument
inlineuicontainer
【解决方案1】:
我遇到了同样的问题并设法使以下内容起作用:
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 给出了如何实现这一目标的示例。