정규 스택 패널 대신 가상화 스택 패널을 사용하도록 itempresenter를 무시할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/9503433

문제

배경

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>
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top