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に 2 つの列を追加します。最初の列は StackPanel で、2 番目の列はdocumentViewです段落ごとに TextBlock を StackPanel.Children に追加し、Paragraph.ElementStart.GetCharacterRect(LogicalDirection.Forward) メソッドと返されたRectの Top & Bottom プロパティを使用して各 textBlock の高さを設定します。

すべて問題なく、段落が 500 未満の場合、番号付けはすばやく更新されますが、テキストが大きくなるにつれて遅くなります。どうすれば効率化できますか?StackPanel の代わりに Canvas を使用する必要がありますか? または、これを行うより良い方法はありますか?

ありがとう。

4

2 に答える 2

0

リストビュー グリッドビュー。仮想化をサポートします。非常に大きなドキュメントの各行にテキストブロックを使用し、うまく機能します。

于 2012-11-11T20:00:48.203 に答える
0

質問で言及した手順を使用してから、方法を使用しましたDispacher.BeginInvoke(...)。に設定DispatcherPriorityしましたApplicationIdle。幅の変更や新規Paragraph追加時に呼び出します。次のように:

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