我在WPF表单上使用WPF的RichTextBox
时遇到了令人望而却步的性能问题。
所以我现在尝试的是用TextBlock
s替换所有富文本控件,并在用户单击时用RichTextBox
替换TextBlock
。
为了达到这个目的,我做了一个这样的LazyRichTextBox
。
class LazyRichTextBox : UserControl
{
// lots of detail skipped
protected override void OnPreviewMouseDown(MouseButtonEventArgs e)
{
if (!(Content is RichTextBox))
{
var box = new RichTextBox { Document = FlowDocumentHtmlConverter.ReplaceDocContent(RichText) };
Content = box;
}
base.OnPreviewMouseDown(e);
}
}
好消息是,这在某种程度上是有效的:我现在得到了一个可编辑的文本框。但是不能工作的是它不能把插入符号放到正确的位置。控件甚至不能从鼠标单击中获得焦点,用户必须再次单击才能开始键入。
现在,在点击时神奇地替换控件可能不是唯一的解决方案。我也可以试着找出TextBlock
上被点击的字符位置,然后创建RichTextBox
,并相应地设置焦点和插入符号。这可能吗?
记录:我知道有更多的工作要做:我需要确保TextBlocks出现相同的RichTextBox出现以后,标签行为需要处理。我现在专注于获得点击场景尽可能好。
更新:谢谢你的评论。我有非常有限的富文本,所以我知道我可以模仿他们与textblock。性能问题是由于可疑的内存泄漏,在使用两小时后导致2GB的内存占用。我正在使用RichTextBox/FlowDocument,因为我不知道任何其他方式来编辑文本与内联格式,将有兴趣的替代品。
事实证明有一个解决方案来获得插入位置:在MouseDown中,我将控件转换为'RichTextBox'。我调用UpdateLayout(),然后将焦点设置在其上,然后,WPF可以像这样计算插入位置:
rtb.CaretPosition = rtb.GetPositionFromPoint(clientPoint, true);
还有一些额外的问题,如果有人感兴趣的话,我可以详细说明。