정규 스택 패널 대신 가상화 스택 패널을 사용하도록 itempresenter를 무시할 수 있습니까?
-
14-11-2019 - |
문제
배경
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>
질문
항목 발표자가 가상화 스택 패널을 사용하도록 강제 할 수 있습니까?
노트
- 이미 ScrollViewer에서 itempresenter를 포장하려고 시도했지만 원하지 않는 결과를 제공합니다 (각 행에 대한 스크롤 막대).
- i Hard CancontentsCroll= true가 가상화를 거짓으로 가상화 할 때 가상화를 사용 불가능하게하지 않으므로 TRUE를 테스트합니다.
- 이 제어는 생산 중이며 여러 장소에서 사용 되므로이 시점에서 디자인을 대체 / 다시 쓰거나 주요 수정을 수행 할 수있는 옵션이 없습니다. 가능한 경우이 한 섹션을 재정의하려고합니다.
어떤 제안이나 옵션이 많이 감사합니다.
해결 :
이를 스타일에 추가하여 템플릿의 스타일을 수정했으며 스택 패널을 가상화로 전환했습니다.
.<Setter Property="ItemsPanel"> <Setter.Value> <ItemsPanelTemplate> <VirtualizingStackPanel /> </ItemsPanelTemplate> </Setter.Value> </Setter>
해결책
시도
<TreeView>
<TreeView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
</TreeView.ItemsPanel>
</TreeView>
.
또는
<TreeView VirtualizingStackPanel.IsVirtualizing="True">
.
obviosuly TreeView 컨트롤 이름으로 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>
.