2

バックグラウンド

TreeViewから継承し、データグリッドスタイルで表示するように変更されたカスタムコントロールがあります。私が見ている問題は、ツリーを拡張するときのパフォーマンスにあります。これは、ツリービューに関する私の調査から一般的です。WPFパフォーマンスツールで調べたところ、ItemsPresenterクラスが仮想化スタックパネルではなく通常のスタックパネルを使用していることに気付きました。

ここに画像の説明を入力してください

これは、ScrollContentPresenterが使用されるコードのセクションです(画像に表示されています)。

<ScrollContentPresenter Name="PART_ScrollContentPresenter"
      KeyboardNavigation.DirectionalNavigation="Local"
      Content="{TemplateBinding Content}"
      ContentTemplate="{TemplateBinding ContentTemplate}"
      CanContentScroll="{TemplateBinding CanContentScroll}"
      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>

渡されるテンプレートは次のとおりです。

    <ControlTemplate TargetType="CommonControls:TreeListViewItem508">
    <Grid >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Border x:Name="item">
            <Border Name="InnerBorder">
                <Grid Style="{StaticResource GridBackgroundStyle}">
                    <Rectangle Visibility="Collapsed" Fill="#75FFFFFF" Name="UpperHighlight" />
                </Grid>
            </Border>
        </Border>
        <ItemsPresenter Grid.Row="1" Name="ItemsHost" />
    </Grid>
</ControlTemplate>

質問

アイテムプレゼンターに仮想化スタックパネルの使用を強制することは可能ですか?

ノート

  • すでにItemsPresenterをScrollViewerでラップしようとしましたが、望ましくない結果が得られます(各行のスクロールバー)。
  • オプションCanContentScroll=trueをテストとしてハードコーディングしました。これは、falseに設定すると仮想化が無効になるためです。
  • このコントロールは本番環境にあり、複数の場所で使用されているため、現時点では、デザインを置き換えたり、書き換えたり、大幅な変更を加えたりすることはできません。可能であれば、この1つのセクションをオーバーライドすることを検討しています。

任意の提案やオプションは大歓迎です。

解決済み:

これをスタイルに追加してテンプレートのスタイルを変更すると、スタックパネルが仮想化に切り替わりました。

 <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
4

2 に答える 2

4

を使用できますが、StackPanel の仮想化には単に を使用するだけではVirtualizingStackPanelないことに注意してください。VirtualizingStackPanel

上記のリンクにあるコードを使用した例を次に示します。これには、必要なアイテムがリストされています。

<ItemsControl ...
    VirtualizingStackPanel.IsVirtualizing="True" <!-- this is needed -->
    ScrollViewer.CanContentScroll="True" > <!-- this is needed -->
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel />  <!-- this is needed -->
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.Template>
        <ControlTemplate>
            <Border ...>
                <ScrollViewer> <!-- this is needed -->
                    <ItemsPresenter />
                </ScrollViewer>
            </Border>
        </ControlTemplate>
    </ItemsControl.Template>
</ItemsControl>
于 2012-02-29T17:19:00.793 に答える
3

試す

      <TreeView>
        <TreeView.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel/>
            </ItemsPanelTemplate>
        </TreeView.ItemsPanel>
    </TreeView>

また

<TreeView VirtualizingStackPanel.IsVirtualizing="True">

明らかに、TreeViewをツリービューコントロール名に置き換えます。

お役に立てば幸い

ポール

于 2012-02-29T17:12:31.213 に答える