目标是向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吗?或者有更好的方法吗?
感谢。
答案 0 :(得分:0)
ListView GridView。支持虚拟化。我在一些非常大的文档中为每一行使用了textblock,效果很好。
答案 1 :(得分:0)
我使用了问题中提到的过程IS,然后是Dispacher.BeginInvoke(...)
方法。我将DispatcherPriority
设置为ApplicationIdle
。我在宽度更改或添加新Paragraph
时调用它。是这样的:
_updateIfWidthChangedDispacherO= _ownerTextBox.Dispatcher.BeginInvoke((Action)(() =>
{
updateIfWidthChanged();
}),
DispatcherPriority.ApplicationIdle);