私は、WPFのTreeViewコントロールのUI仮想化機能をチェックしてきました。これは、私が理解しているように、.NET3.5SP1以降で使用できます。
UI仮想化が正しく実行されていることを確認するための簡単なプロジェクトを作成しましたが、まったく機能しないことがわかりました。現在画面に表示されているアイテムだけでなく、すべてのアイテムが取得されます。
私のXAMLは次のようになります
<TreeView x:Name="myTree" Height="150" ItemsSource="{Binding Items}"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Standard"
ScrollViewer.IsDeferredScrollingEnabled="True" />
そして私の背後にあるコード
public IEnumerable Items { get; set; }
public MainWindow()
{
Items = GenerateList();
this.DataContext = this;
InitializeComponent();
}
private IEnumerable GenerateList()
{
MyList list = new MyList();
for (int i = 0; i < 1000; i++)
{
list.Add("Item " + i);
}
return list;
}
これMyList
は私自身の実装でありIList
、保持されたArrayList
ものに呼び出しを転送し、呼び出されたArrayList
メソッド/プロパティをコンソールに書き込むだけであることに注意してください。例えば:
public object this[int index]
{
get
{
Debug.WriteLine(string.Format("get[{0}]", index));
return _list[index];
}
set
{
Debug.WriteLine(string.Format("set[{0}]", index));
_list[index] = value;
}
}
TreeViewをListBoxに置き換えると、UI仮想化は期待どおりに機能します。つまり、要求されるアイテムは最大20個で、1000個全体ではありません。
私はここで何か間違ったことをしていますか?
編集
ItemsPanel
また、提案されているように、デフォルトをに置き換えてみましたVirtualizingStackPanel
が、同じ結果が得られています。