我RichTextBox
在 WPF 表单上遇到了令人望而却步的 WPF 性能问题。
所以我现在尝试的是用TextBlock
s替换所有富文本控件,并在用户点击时TextBlock
用a替换。RichTextBox
为了实现这一点,我做了一个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 相同,需要处理选项卡行为。我现在专注于让 Click 场景尽可能好。
更新: 感谢您的评论。我的富文本非常有限,所以我知道我可以用 TextBlocks 来模拟它们。性能问题是由于怀疑内存泄漏,导致使用两小时后内存占用达到 2GB。我正在使用 RichTextBox/FlowDocument,因为我不知道任何其他方式来编辑具有内联格式的文本,我会对替代方案感兴趣。