4

私は、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が、同じ結果が得られています。

4

1 に答える 1

2

ItemsPanelTemplateTreeViewのデフォルトはであり、仮想化が表示されないのはそのためではStackPanelありません。VirtualizingStackPanelListBoxのデフォルトのItemsPanelTemplateはVirtualizingStackPanelであるのに対し、ListBoxでは設定がVirtualizingStackPanel.IsVirtualizing="True"機能するのはそのためです。

プロパティの設定とは別にTreeViewで仮想化を有効にするにVirtualizingStackPanel.IsVirtualizing="True"は、次のようにデフォルトのitemsPanelTemplateをオーバーライドする必要があります-

<TreeView x:Name="myTree" Height="150" ItemsSource="{Binding Items}"
          VirtualizingStackPanel.IsVirtualizing="True"
          VirtualizingStackPanel.VirtualizationMode="Standard"
          VirtualizingStackPanel.CleanUpVirtualizedItem="myTree_CleanUpVirtualizedItem"
          ScrollViewer.IsDeferredScrollingEnabled="True">
    <TreeView.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel IsItemsHost="True" />                   
        </ItemsPanelTemplate>
    </TreeView.ItemsPanel>
</TreeView>
于 2012-07-22T13:00:14.707 に答える