regularスタックパネルの代わりに仮想化スタックパネルを使用するようにItemSpresenterをオーバーライドすることは可能ですか?
-
14-11-2019 - |
質問
背景
TreeViewから継承し、データグリッドスタイルに表示するように変更されたカスタムコントロールがあります。私が見ている問題は、ツリーを展開するときにパフォーマンスがあります。これは私の景色を望む私の研究から一般的です。 WPFパフォーマンスツールを使用すると、ItempResenterクラスは仮想化スタックパネルの代わりに通常のスタックパネルを使用していることがわかりました。
これは、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>
質問
商品発表者に仮想化スタックパネルを使用するように強制することは可能ですか?
注
- 私はすでにScrollViewerでItemSpresenterをラッピングしようとしましたが、望ましくない結果(各行のスクロールバー)を表示しました。
- I HARD CONDONTENTSCROLL= TRUEをテストとして符号化します。
- このコントロールは製造中で、この時点でデザインに大きな修正を置き換える/書き換えを行うことができないため、複数の場所で使用されています。可能であれば、この1つのセクションを上書きしようとしています。
提案やオプションはあらゆることに大きな感謝があります。
解決済み:
スタイルにこれを追加してテンプレートのスタイルを変更し、スタックパネルを仮想化するように切り替えました。
.<Setter Property="ItemsPanel"> <Setter.Value> <ItemsPanelTemplate> <VirtualizingStackPanel /> </ItemsPanelTemplate> </Setter.Value> </Setter>
解決
を試してください
<TreeView>
<TreeView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
</TreeView.ItemsPanel>
</TreeView>
.
または
<TreeView VirtualizingStackPanel.IsVirtualizing="True">
.
は、ツリービューのコントロール名を使用して、Whivewale TreeViewに置き換えます。
を助けたい
Paul
他のヒント
VirtualizingStackPanel
を使用できますが、 VirtualizingStackPanel
を使用するだけでは、スタックパネルを仮想化する方が多いです。/ P>
これは、上記のリンクにあるコードを使用した例です。
<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>
.