0

目标是将一列段落编号添加到 RichTextBox(数字显示该richtextbox.Document.Blocks 中的段落索引)。目前,我在 RichTextBox 的 LayoutUpdated 事件中使用了这段代码:

bool _added=false
void onLayoutUpdated(object sender, EventArgs e)
{
   if (!_added)
   {
      _added= true;
      scv = Helper.GetFind.FindChild<ScrollViewer>(this, null);
      if (scv != null)
      {
         FrameworkElement  documentView = scv.Content as FrameworkElement;
         scv.ClearValue(ScrollViewer.ContentProperty);
         Grid grid= new Grid();

...我会谈谈我在这里添加的内容...

         scv.Content = grid;
         UpdateLayout();
      }
   }
}

grid中,我添加了两列,第一列是 StackPanel,第二列是documentView。对于每个段落,我将 TextBlock 添加到 StackPanel.Children,并使用 Paragraph.ElementStart.GetCharacterRect(LogicalDirection.Forward) 方法和返回的Rect (s) 的顶部和底部属性设置每个文本块的高度。

一切都很好,当段落少于 500 时,编号会快速更新,但是随着文本变大,它会变慢。我怎样才能使它更有效率?我应该使用 Canvas 而不是 StackPanel 吗?或者有没有更好的方法来做到这一点?

谢谢。

4

2 回答 2

0

列表视图网格视图。支持虚拟化。我在一些非常大的文档中为每一行使用文本块,效果很好。

于 2012-11-11T20:00:48.203 回答
0

我使用了我在问题中提到的程序,然后是Dispacher.BeginInvoke(...)方法。我设置DispatcherPriorityApplicationIdle. 我在 Width 更改或Paragraph添加新时调用它。像这样:

 _updateIfWidthChangedDispacherO= _ownerTextBox.Dispatcher.BeginInvoke((Action)(() =>
        {
            updateIfWidthChanged();
        }),
        DispatcherPriority.ApplicationIdle);
于 2012-11-28T17:22:17.863 回答