バックグラウンド
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>