0

RichTextBox在 WPF 表单上遇到了令人望而却步的 WPF 性能问题。

所以我现在尝试的是用TextBlocks替换所有富文本控件,并在用户点击时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,因为我不知道任何其他方式来编辑具有内联格式的文本,我会对替代方案感兴趣。

4

1 回答 1

0

原来有一个获得插入位置的解决方案:在 MouseDown 中,我将控件转换为“RichTextBox”。我调用 UpdateLayout(),然后在其上设置 Focus,然后 WPF 可以像这样计算插入位置:

        rtb.CaretPosition = rtb.GetPositionFromPoint(clientPoint, true);

还有一些额外的陷阱,如果有人感兴趣,我可以详细说明。

于 2013-04-15T14:00:16.467 回答