创建Numbered RichtextBox的最佳方法是什么?

时间:2012-11-11 18:53:45

标签: c# wpf richtextbox

目标是向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();
      }
   }
}

网格中,我添加了两列,第一列是StackPanel,第二列是 documentView 。对于每个段落,我向StackPanel.Children添加一个TextBlock,并使用Paragraph.ElementStart.GetCharacterRect(LogicalDirection.Forward)方法和Top&amp; amp;设置每个textBlock的高度。返回的 Rect 的底部属性。

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

感谢。

2 个答案:

答案 0 :(得分:0)

ListView GridView。支持虚拟化。我在一些非常大的文档中为每一行使用了textblock,效果很好。

答案 1 :(得分:0)

我使用了问题中提到的过程IS,然后是Dispacher.BeginInvoke(...)方法。我将DispatcherPriority设置为ApplicationIdle。我在宽度更改或添加新Paragraph时调用它。是这样的:

 _updateIfWidthChangedDispacherO= _ownerTextBox.Dispatcher.BeginInvoke((Action)(() =>
        {
            updateIfWidthChanged();
        }),
        DispatcherPriority.ApplicationIdle);