WPF RichTextBox自定义文本属性

时间:2009-07-16 13:34:39

标签: wpf wpf-controls richtextbox

好的,我正在尝试向RichTextBox控件中的一段文本添加“自定义属性”。我觉得这很容易,但显然不是: - )

我想要的基本功能是能够在特定单词上设置属性,并且能够在双击单词时检测到该属性是否存在。

我的初始方法是创建一个新的DP并将其应用于文本,但TextRange实际上并不是DependencyObject,而Reflector表明它只接受某些直接映射到“真实”属性的DP。

不幸的是,我似乎无法找到任何其他“钩子”来让我这样做。我不能继承任何我可以应用于文本的东西,因为我需要的是密封或包含内部摘要,所以我有点不知所措。

我可以跟踪外部具有属性的范围,并在文本更新时更新,但这听起来非常糟糕,我真的不想为这一个功能创建自己的RichTextBox !

欢迎任何建议: - )

2 个答案:

答案 0 :(得分:2)

使用RichTextBox的个人经验告诉我,如果它们看起来很相似,那么这个控件可能会组合Run和Spans,这意味着你将丢失你尝试使用TextRange设置的自定义信息。 TextRange的重叠区域发生了很多。所以基本上,你不能使用TextRange来解决这个问题。

我们在这个控件上遇到了类似的问题,实际上我们最终遇到了一些肮脏的黑客攻击。以下是我们最终做的事情:

您可以将InlineUIContainer和BlockUIContainer元素插入FlowDocument中。在其中一个容器中,您可以放置​​任何您想要的UIElement。我们最终创建了一个附加属性,并将这些信息宝石放置在那些UIContainers中的Control控件中。

如果我们需要这些信息,我们会查找最近的容器元素,提取信息,等等......这是一个拖累......我知道,但它有效:).. ..

但有一个问题..用户可以手动删除这些容器,只需按下删除按钮即可。但是,您可以使用将在发生这种情况时触发的“已卸载”事件来检测此事件。

答案 1 :(得分:0)

InlineUIContainers将保存在对XamlPackage的TextRange.Save调用中,即使preserveTextElements为true也是如此。我认为你必须使用XamlWriter来保存InlineUIContainers,但是你失去了将图像嵌入到文档中的能力。

我还没有找到一种在文档片段上嵌入自定义属性并能够嵌入图像的方法。