在WPF表单上创建富文本框,并设置插入符号以正确的位置



我在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);

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

相关内容

  • 没有找到相关文章

最新更新