1

.Net 4.0 C# WPF 基幹業務アプリを開発しており、(読み取り専用) 大きなテキスト ファイルをユーザーに表示する必要があります。TextBlockSOに記載されているように、オプションではなく、提案されたAvalonEditコントロールを試しました。AvalonEdit.Sample スタンドアロン アプリを実行すると、8,000 行の 4MB ファイルを 1 秒未満でロードできますが、AvalonEditTextEditorを WPF アプリに埋め込むと、前の とほぼ同じ 20 秒かかりTextBlockます。

UI は非常に複雑で、ツリー メニューとフォームのスプリッターがあります。フォームには、サイズ変更可能なゾーンを作成するためのスプリッターがいくつかあり、そのうちの 1 つにタブ コントロールが含まれています。タブ項目の 1 つにTextEditorAvalonEdit からのものがあります。

XAML

<avalonEdit:TextEditor Name="Tbx" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" />

CS

public void ShowFile(string path)
{
  Tbx.Text = string.Empty;
  ThreadPool.QueueUserWorkItem(o => {
      var lines = File.ReadAllLines(path).Join("\n");
      Dispatcher.BeginInvoke(() => Tbx.Text = lineas);
  });
}

ファイルをロードするとき、私のラップトップ i7 4 コアの CPU 使用率は 33% です。

スタンドアロン アプリとしての AvalonEdit の動作とTextEditor、カスタム WPF アプリ内での AvalonEdit の動作の違いについて何か提案はありますか?

で大きなファイル (10MB、10k 行) をロードする方法はTextEditor?

アップデート:

ビジュアル ツリー:

ビジュアルツリー

のプロパティTextEditor:

TextEditor プロパティ

指摘されたとおりにホストする ScrollViewer を削除しましたTextEditorが、同じようにパフォーマンスが低下します。

更新 2:を新しいウィンドウ に移動しTextEditorてレイアウトを縮小しましたが、それでもパフォーマンスが低下します。

新しい簡素化されたビジュアル ツリー:

ビジュアル ツリー 2

Grid列と行の定義は*.

のプロパティTextEditor:

TextEditor プロパティ

4

3 に答える 3

4

アプリケーションのビジュアル ツリーを見て ( Snoopが役立つ場合があります)、TextEditor コントロールの周りに ScrollViewer があるかどうかを確認します。

スクロール ビューアーは、含まれるコントロールに無限のスペースを与えるため、UI の仮想化が無効になり、パフォーマンスが低下します (エディターは、表示されている部分だけでなく、ドキュメント全体をレンダリングする必要があります)。

何らかの理由でネストされたスクロール ビューアが必要な場合は、ネストされたスクロール領域の質問に関する私の回答を見て、含まれているコントロールに無限のスペースを与えないようにする方法を確認してください。

于 2013-02-07T16:18:13.273 に答える
3

仮想化が水平に実行されていないことがわかりました。私の場合、改行のない大きな XML ファイルがあり、水平スクロールが非常に大きく、レンダリングに 10 秒以上かかりました。同じテキストが (改行で) フォーマットされると、1 秒未満でレンダリングされます。

于 2015-07-27T09:16:21.713 に答える
0

TextDocumentクラスにはSetOwnerThread()という関数があり、ドキュメントから、ドキュメントの読み込みとレンダリングのために一時的に別のスレッドを設定できるようです。

以下はTextDocument.csのコメントからです

    /// <summary>
    /// Transfers ownership of the document to another thread. This method can be used to load
    /// a file into a TextDocument on a background thread and then transfer ownership to the UI thread
    /// for displaying the document.
    /// </summary>
    /// <remarks>
    /// The owner can be set to null, which means that no thread can access the document. But, if the document
    /// has no owner thread, any thread may take ownership by calling SetOwnerThread.
    /// </remarks>
于 2013-03-16T07:32:26.080 に答える