2012-02-29 2 views
1

фонМожно ли переопределить ItemsPresenter для использования виртуализации StackPanel вместо обычной панели стека?

У меня есть пользовательский элемент управления, который наследуется от TreeView и модифицирован для отображения в стиле сетки данных. Проблема, которую я вижу, связана с производительностью при расширении дерева. Это часто встречается в моих исследованиях с Tree Views. После проверки с помощью инструментов WPF Performance я заметил, что класс ItemsPresenter использует обычную стеквую панель вместо панели виртуализации стека.

enter image description here

Вот часть кода, где используется 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> 

ответ

2

Попробуйте

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

или

<TreeView VirtualizingStackPanel.IsVirtualizing="True"> 

Obviosuly заменить TreeView, с вашим именем управления TreeView.

Надежда, что помогает

Пол

+0

Второй вариант только делает верхний уровень - это не Fo понизьте до уровня ребенка. Первая идея работала. Спасибо за идею. – tsells

+0

Без проблем, рад, что это помогло. –

2

Вы можете использовать VirtualizingStackPanel, однако следует помнить, что there is more to virtualizing a StackPanel than just using a 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> 
Смежные вопросы