У меня есть пользовательский элемент управления, который наследуется от TreeView и модифицирован для отображения в стиле сетки данных. Проблема, которую я вижу, связана с производительностью при расширении дерева. Это часто встречается в моих исследованиях с Tree Views. После проверки с помощью инструментов WPF Performance я заметил, что класс 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.
- Этот элемент управления находится в производстве и используется в нескольких местах, поэтому у меня нет возможности заменить/переписать/или выполнить основные изменения дизайна на данный момент. Я просто хочу переопределить этот раздел, если это возможно.
Любые предложения или варианты приветствуются.
Постановили:
Я изменил стиль шаблона, добавив в стиль и переключил стек панели виртуализации.
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
Второй вариант только делает верхний уровень - это не Fo понизьте до уровня ребенка. Первая идея работала. Спасибо за идею. – tsells
Без проблем, рад, что это помогло. –