問題タブ [virtualizingstackpanel]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
4218 参照

wpf - ScrollViewer 内での WPF DataGrid の仮想化の使用

DataGrid は仮想化をサポートしていることを知っているので、表示されている行に対してのみグリッド セルを作成します。ただし、これは DataGrid のサイズが制限されている場合にのみ機能するようです。

私のシナリオでは、DataGrid はスクロール ビューアー内に配置されます。

これは仮想化を壊すようです。DataGrid が多数の項目を表示する必要がある場合、外側の ScrollViewer で下にスクロールする前であっても、ビジュアル ツリーが非常に大きくなります。

ScrollViewer が下にスクロールしているときに DataGrid がすべてのセルを事前に作成するのを防ぐ方法はありますか?

編集: 基本的に、これをホストするページは、上部にいくつかのテキスト、大きなテーブル、下部にいくつかのテキストがある Web ページのようにする必要があります。上部/下部が常に表示され、グリッドのみがスクロールされるドックビューの代わりに、ページ全体がスクロールする必要があります。セットアップはこれを達成しますが、すべてが事前に作成されていることに苦しんでいます。

別の編集: データグリッドの特定の行がスクロールされて表示されたことを検出する方法はありますか? 典型的な遅延読み込み記事は、データグリッドのスクロールビューアーを使用してグリッドにさらに項目を追加しますが、ここでは機能しません。

0 投票する
0 に答える
169 参照

wpf - Type.InvokeMember の用途は何ですか

私は WPF アプリケーションで作業しており、ある場所でこのコードを使用して VirtualizingStackPanel への参照を取得する必要がありました。

以下はコードの一部です。

誰かがこの行が正確に何をしているのか、そしてそれらのバインディングフラグは何なのかを説明できますか?

0 投票する
4 に答える
3026 参照

wpf - 仮想化されたリストを使用した VirtualizingStackPanel

リスト/グリッドのようなもので、他の場所 (データベースなど) からロードされたかなり大量のアイテムを表示するアプリケーションを開発しています。

すべての項目を常にメモリに保持しておくのはもったいないので、リストの一部を仮想化する方法を検討しています。VirtualizingStackPanel私が必要としているもののように思えます - ただし、アイテムのUIを仮想化するのはうまくいくようですが、基礎となるアイテムリスト自体の一部を仮想化する方法がわかりません.

小さなサンプルとして、これをメイン ウィンドウとする WPF アプリケーションを考えてみましょう。

リストを提供するコード ビハインドは次のようになります。

したがって、これは を含むアプリケーションを表示し、添付プロパティListBoxを使用して項目を強制的に仮想化します。データ コンテキストからアイテムを取得します。このカスタム実装には、オンザフライで 10000 個のデータ アイテムを作成する (インデクサー経由で取得した場合) が提供されます。IsVirtualizingIList<T>

デバッグの目的で、アイテムが作成されるたびにテキストADD #(#アイテム インデックスに等しい) が出力され、アイテムがビューから外れてその UI が仮想化スタック パネルによって解放されると、CleanUpVirtualizedItemイベントが出力に使用されます。DEL #

今、私の願いは、カスタム リストの実装が要求に応じてアイテムを提供することです。この最小限のサンプルでは、​​オンザフライでアイテムを作成し、実際のプロジェクトではデータベースからアイテムをロードします。残念ながら、VirtualizingStackPanelこのようには動作しないようです。代わりに、プログラムの開始時にリストの列挙子を呼び出し、最初に 10000 個のアイテムすべてを取得します!

したがって、私の質問は次のとおりです。GUI要素の数を減らすだけでなく、データの実際の仮想化(すべてのデータをロードしないなど)にVirtualizingStackPanelを使用するにはどうすればよいですか?

  • 列挙子を使用するのではなく、仮想化スタック パネルにアイテムの総数を伝え、必要に応じてインデックスでアクセスするように指示する方法はありますか? (たとえば、私の記憶が正しければ、Delphi Virtual TreeView コンポーネントは機能します。)
  • アイテムが実際に表示されたときにイベントをキャプチャする独創的な方法はありますか?少なくとも、通常は各アイテムの一意のキーを保存し、要求されたときに残りのアイテム データのみをロードできますか? (ただし、WPF API を満たす以外に、実際の理由もなく完全な長さのリストを提供する必要があるため、これはハッキーな解決策のように思えます。)
  • この種の仮想化により適した別の WPF クラスはありますか?

編集:開発ヘッジホッグのアドバイスに従って、カスタムICollectionView実装を作成しました。一部のメソッドは s をスローするように実装されてNotImplementedExceptionいますが、ウィンドウが開かれたときに呼び出されるメソッドは実装されていません。

ただし、そのコレクション ビューに対して最初に呼び出されるのは、GetEnumerator10000 個の要素すべてを再度列挙するメソッドであるようです (デバッグ出力で証明されているように、1000 番目のアイテムごとにメッセージを出力します)。避けるために。

問題を再現する例を次に示します。

Window1.xaml

Window1.xaml.cs

0 投票する
1 に答える
1060 参照

c# - ListView ItemsContainer を VirtualizationStackPanel として設定すると、選択した項目を正しく取得できませんでした

ListView の項目が多すぎるため、'VirtualizingStackPanel.IsVirtualizing' を true に設定し、'VirtualizingStackPanel.VirtualizationMode' を 'Recycling' に設定しました。ListView の SelectionMode は拡張され、ListViewItem の 'IsSelected' プロパティはモデルの 'IsSelected' プロパティにバインドされ、バインド モードは双方向です。

Ctrl+A ですべての項目を選択したい場合、項目の一部しか選択されないため、以下のように KeyBinding を使用して select all メソッドを記述します。

SelectAll メソッドは、ItemsSource コレクションをループし、各項目の IsSelected プロパティを true に設定します。しかし、それは予期せぬ事態にもつながります。すべてのアイテムが選択されたら、スクロールバーを一番下までスクロールすると、ListView にさらにアイテムが読み込まれます。1 つのアイテムをシングルクリックすると、他のすべてのアイテムが選択されていないことが予想され、このアイテムのみを選択します。しかし、他のアイテムの選択を解除することはできないようです。

誰でも助けることができますか?

0 投票する
1 に答える
264 参照

wpf - VirtualizingStackPanel は、新しい場合にのみ高速です。どうすれば修正できますか?

仮想化を有効にして作成ListBoxし、すべてのアイテムの外観を更新すると、非常に高速に動作します。しかし、すべてのアイテムをゆっくりと下にスクロールしてListBoxから、すべてのアイテムの外観を更新すると、多くの時間がかかります。VirtualizingStackPanelビューポートを使い果たしたときにアイテムを破壊しないためだと思います。この動作を再現する簡単なアプリを作成しました。

コード:

XAML:

「UpdateText」ボタンをクリックすると、すべてのテキストボックスのテキストが更新されます。スクローラーをドラッグして最後までゆっくりスクロールすると、「UpdateText」ボタンのクリックが非常に遅くなります。

0 投票する
1 に答える
7422 参照

wpf - StackPanel の巨大な ListBox のパフォーマンスを改善しますか?

StackPanel を使用して、いくつかのコントロールを垂直にレイアウトしています (つまり、タイトル、サブタイトル、リストボックス、セパレーター、リストボックスなど)。

StackPanel は ScrollViewer の子であり、コンテンツが常にスクロール可能であることを保証します。

StackPanel のコントロールの 1 つは ListBox です。

その ItemsSource は巨大なコレクションにバインドされたデータであり、複雑な DataTemplate を使用して各アイテムを実現します。

残念ながら、それを使用するとパフォーマンスが非常に低下します (CPU/メモリが高い)。

私は試した

  • ListBox の ItemsPanel を VirtualizingStackPanel に設定し、
  • その ControlTemplate を ItemsPresenter のみにオーバーライドします (ListBox の ScrollViewer を削除します)。

しかし、パフォーマンスに違いはありませんでした。StackPanel は、測定中に内部の子に無限の高さを与えると思いますか?

ScrollViewer と StackPanel を他のパネル/レイアウト (Grid、DockPanel など) に置き換えたところ、パフォーマンスが大幅に向上したため、ボトルネックと解決策は仮想化にあると思いました。

このビューの CPU/メモリ パフォーマンスを改善する方法はありますか?

ここに画像の説明を入力

【アップデート1】

元のサンプル プロジェクト: http://s000.tinyupload.com/index.php?file_id=29810707815310047536

【アップデート2】

次の例を考え出すために、TreeView/TreeViewItems のスタイル変更/テンプレート化を試みました。起動にまだ時間がかかる/同じで、メモリ使用量が多い。しかし、一度読み込まれると、スクロールは元のサンプルよりもはるかに反応が良くなります.

起動時間/メモリ使用量をさらに改善する他の方法があるかどうか疑問に思いますか?

TreeView プロジェクトのスタイルを変更: http://s000.tinyupload.com/index.php?file_id=00117351345725628185

【アップデート2】

pushprajのソリューションは魅力のように機能します

  • オリジナル:
    • 起動:35秒、
    • メモリ: 393MB
    • スクロール: 遅い
  • ツリー表示:
    • スタートアップ:18代、
    • メモリー 377MB、
    • スクロール: 高速
  • pushpraj のソリューション:
    • 起動: <1 秒、
    • メモリ: 20MB、
    • スクロール: 高速