[解決済み] ItemsControlの仮想化?
質問
私は
ItemsControl
には仮想化したいデータのリストが含まれています。
VirtualizingStackPanel.IsVirtualizing="True"
では動作しないようです。
ItemsControl
.
これは本当にそうなのでしょうか、それとも私の知らない別の方法があるのでしょうか?
テストするために、私はコードの次のブロックを使用しています。
<ItemsControl ItemsSource="{Binding Path=AccountViews.Tables[0]}"
VirtualizingStackPanel.IsVirtualizing="True">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Initialized="TextBlock_Initialized"
Margin="5,50,5,50" Text="{Binding Path=Name}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
を変更すると
ItemsControl
を
ListBox
に変更することができます。
Initialized
イベントはほんの数回しか実行されませんが (大きな余白は数個のレコードを通過させるためです)、 しかし
ItemsControl
として、すべての項目が初期化されます。
を設定することを試みました。
ItemsControlPanelTemplate
を
VirtualizingStackPanel
に変更する必要がありますが、それでは解決しないようです。
どのように解決するのですか?
実は、単に
ItemsPanelTemplate
を使う
VirtualizingStackPanel
. デフォルトの
ControlTemplate
に対して
ItemsControl
には
ScrollViewer
という、仮想化のキーとなる部分がありません。のデフォルトのコントロール・テンプレートに追加すると
ItemsControl
(のコントロール・テンプレートを使って)。
ListBox
をテンプレートとして使用)は、以下のようになります。
<ItemsControl ItemsSource="{Binding AccountViews.Tables[0]}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Initialized="TextBlock_Initialized"
Text="{Binding Name}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel IsVirtualizing="True"
VirtualizationMode="Recycling" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Template>
<ControlTemplate TargetType="ItemsControl">
<Border BorderThickness="{TemplateBinding BorderThickness}"
BorderBrush="{TemplateBinding BorderBrush}"
Background="{TemplateBinding Background}">
<ScrollViewer CanContentScroll="True"
Padding="{TemplateBinding Padding}"
Focusable="False">
<ItemsPresenter />
</ScrollViewer>
</Border>
</ControlTemplate>
</ItemsControl.Template>
</ItemsControl>
(ちなみに、デフォルトのコントロール・テンプレートを見るための素晴らしいツールは テンプレートを見る )
注意すること
を設定する必要があります。
ScrollViewer.CanContentScroll="True"
を設定する必要があります。
ここで
を参照してください。
また、私が
VirtualizingStackPanel.VirtualizationMode="Recycling"
. これによって
TextBlock_Initialized
が呼び出される回数を、画面上に表示されている TextBlock の数だけ減らすことができます。UI の仮想化について詳しくは
はこちら
.
EDIT: 当然のことを言うのを忘れていました: 別の解決法として、単に
ItemsControl
を
ListBox
:)
また、これをチェックアウトして
MSDN のパフォーマンスの最適化に関するページ
を見て、次のことに注目してください。
ItemsControl
が "Controls That Implement Performance Features" テーブルにないことに注意してください。
関連
-
例外の解決方法 GDI+でジェネリックエラーが発生しました。
-
WPFバインディング(データバインディング)の使用方法
-
[解決済み】Visual Studio 2015の追加デバッグオプションの無効化
-
[解決済み] WPFのテキストラップとWrapWithOverflowの比較
-
[解決済み] wpf: ボタンがコマンドによって無効にされたとき、ツールチップを表示する方法は?
-
[解決済み] WPF:幅(と高さ)をパーセント値で設定する
-
[解決済み] WPF: グリッドに列/行のマージン/パディングを設定できますか?
-
[解決済み] WPF Numeric UpDownコントロールはどこにありますか?
-
[解決済み] 読み取り専用のGUIプロパティをViewModelにプッシュバックする
-
[解決済み] ViewModelLocatorとは何ですか?また、DataTemplatesと比較した場合の長所と短所は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
WPFバインディング(データバインディング)の使用方法
-
[解決済み] ラジオボタンをenumにバインドするには?
-
[解決済み】ListBox.SelectionMode="None "がないのですが、リストボックスの選択を無効にする他の方法はないでしょうか?
-
[解決済み] 静的プロパティへのバインディング
-
[解決済み] Generic.xamlの特徴とは?
-
[解決済み] WPF: スクロールバー付きItemsControl (ScrollViewer)
-
[解決済み] Prism for WPFとは?
-
[解決済み] WPFのキーボードショートカット
-
[解決済み] XAMLで複数のバリューコンバータを連結する方法はありますか?
-
[解決済み] ViewModelLocatorとは何ですか?また、DataTemplatesと比較した場合の長所と短所は何ですか?