問題タブ [ui-virtualization]
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.
wpf - DataGrid WPF 仮想化とコマンド CanExecute
フレームワーク.NET 4.0を使用してWPFアプリケーションに取り組んでいます
DataGrid に問題があります。すべての行に 2 つのコマンドがあります。
また、MoveDown にも同じコマンドがあります (最後の行でないかどうかのチェックを実行できます)。
そして DataGrid :
EnableRowVirtualization を true にしてグリッドを仮想化すると、問題が発生します。一番下までスクロールすると (最初の行が表示されなくなります)、最初の行のボタンが上に移動することがあります (通常は上に移動できません)。 )DataGridをクリックするまで有効であり、2番目または3番目も無効になっているため、有効にする必要があります!
EnableRowVirtualization を false に設定すると、この問題は発生しません...
この問題について話しているインターネット上の投稿を 1 つだけ見つけましたが、.net フレームワークの dataGrid はありません: http://www.infragistics.com/community/forums/t/15189.aspx
どうすれば修正できますか?
前もって感謝します
編集:コマンドクラス
wpf - UI 仮想化で再利用される UI コンポーネントに関する通知
水平スクロールバーと垂直スクロールバーを備えた UI 仮想化を備えた Xceed WPF Grid を使用しています。スクロールバーを垂直または水平に使用し、再利用可能な UI コンポーネント (VirtualizingStackPanel.VirtualizationMode="Recycling") を使用する場合、スクロールバー以外からのイベントまたはプロパティの変更が必要です。
c# - VirtualizingStackPanel は仮想化を拒否します
仮想化を実装するカスタム パネルを作成しました。ListBox 内に配置すると、すべて正常に動作します。
ただし、パネルを削除し、仮想化をサポートするために再テンプレート化された ListBox または ItemsControl でデフォルトの VirtualizingStackPanel を使用すると、コントロールは仮想化されません。
仮想化が機能する例:
仮想化が機能しない例:
コントロールは Window 内に直接配置されます。VirtualizingStackPanel が機能しないのはなぜですか?
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、
- スクロール: 高速
c# - WinRT の ViewModel レイヤーでの仮想化
WPF と WinRT (C# + XAML) はどちらも、 などをサポートするパネルを使用して UI 仮想化をサポートしVirtualizingStackPanel
ます。MVVM を使用する場合ビュー モデル (通常は ObservableCollection) の列挙可能なプロパティにバインドされたItemsControl
何らかの種類 ( ListBox
、など) を使用して行われます。GridView
アイテム コントロールは、表示されるアイテムに対してのみ UI を作成します。UI のみが仮想化されるため、UI 仮想化と呼ばれます。表示されていないアイテムのビューのみが作成されず、ユーザーが実際にアイテムにスクロールするまで延期されます。リスト内のビュー モデル オブジェクトはすべて事前に作成されています。したがって、提示する 100,000 人のリストがObservableCollection
ある場合、ユーザーがいつスクロールして表示するかに関係なく、作成される 100,000 のビュー モデルを含める必要があります。
私たちのアプリケーションでは、ビュー モデル レイヤーがこの仮想化の一部になるように実装したいと考えています。アイテム コントロールに、潜在的にロードできるアイテムの総数に適合するスクロール バーを表示する必要があります (そのため、監視可能なコレクションにより、アイテム コントロールは既に 100,000 個のアイテムを含んでいると認識し、スクロール バー ビュー ポートがただし、サーバーから実際のオブジェクトをロードできるように、新しいアイテムが表示されようとするたびに監視可能なコレクションに通知する必要があります。読み込まれたアイテム内にある種の進行状況インジケーターを表示し、オブザーバブル コレクションに読み込まれるとすぐにアイテムの実際のデータ テンプレートに置き換えられるようにしたいと考えています。
MVVM のガイドラインを可能な限り維持したいと考えていますが、パフォーマンスと応答性が優先されます。また、可能であれば再利用可能なソリューションを優先します。
これに取り組む最善の方法は何ですか?