programing

Items Control을 가상화하시겠습니까?

subpage 2023. 4. 19. 23:02
반응형

Items Control을 가상화하시겠습니까?

나는 가지고 있다.ItemsControl가상화하고 싶은 데이터 목록이 포함되어 있습니다.VirtualizingStackPanel.IsVirtualizing="True"에서는 동작하지 않는 것 같습니다.ItemsControl.

이게 정말 사실인가요 아니면 제가 모르는 다른 방법이 있나요?

테스트에는 다음 코드 블록을 사용하고 있습니다.

<ItemsControl ItemsSource="{Binding Path=AccountViews.Tables[0]}"
              VirtualizingStackPanel.IsVirtualizing="True">
<ItemsControl.ItemTemplate>
    <DataTemplate>
        <TextBlock Initialized="TextBlock_Initialized"  
                   Margin="5,50,5,50" Text="{Binding Path=Name}" />
    </DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

변경했을 경우ItemsControl에 대해서ListBox, 나는 볼 수 있습니다.Initialized이벤트는 몇 번밖에 실행되지 않습니다(큰 마진은 몇 개의 레코드만 훑어보면 됩니다).ItemsControl모든 항목이 초기화됩니다.

설정해 보았습니다.ItemsControlPanelTemplate에 대해서VirtualizingStackPanel하지만 그건 도움이 안 되는 것 같아요

사실 이건 단순히 이 모든 것을 만드는 것 말고도 훨씬 더 많은 것이 있습니다.ItemsPanelTemplate사용하다VirtualizingStackPanel. 디폴트ControlTemplate위해서ItemsControl를 가지고 있지 않다ScrollViewer이것이 가상화의 열쇠입니다.기본 컨트롤 템플릿에 추가ItemsControl(컨트롤 템플릿 사용)ListBox템플릿으로서)는, 다음의 정보를 제공합니다.

<ItemsControl ItemsSource="{Binding AccountViews.Tables[0]}">
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <TextBlock Initialized="TextBlock_Initialized"
                 Text="{Binding Name}" />
    </DataTemplate>
  </ItemsControl.ItemTemplate>

  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <VirtualizingStackPanel IsVirtualizing="True"
                              VirtualizationMode="Recycling" />
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>

  <ItemsControl.Template>
    <ControlTemplate TargetType="ItemsControl">
      <Border BorderThickness="{TemplateBinding BorderThickness}"
              BorderBrush="{TemplateBinding BorderBrush}"
              Background="{TemplateBinding Background}">
        <ScrollViewer CanContentScroll="True" 
                      Padding="{TemplateBinding Padding}"
                      Focusable="False">
          <ItemsPresenter />
        </ScrollViewer>
      </Border>
    </ControlTemplate>
  </ItemsControl.Template>
</ItemsControl>

(BTW 기본 컨트롤 템플릿을 참조하기 위한 훌륭한 툴은 Show Me The Template입니다.)

주의사항:

설정하셔야 합니다.ScrollViewer.CanContentScroll="True"이유는 여기를 참조해 주세요.

또, 제가 이렇게 써놓은 것도 주의하세요.VirtualizingStackPanel.VirtualizationMode="Recycling"이렇게 하면 횟수를 줄일 수 있습니다.TextBlock_Initialized는 화면에 표시되는 텍스트블록의 수에 관계없이 호출됩니다.UI 가상화에 대한 자세한 내용은 여기를 참조하십시오.

편집: 명확한 설명을 잊었습니다.대체 솔루션으로서 대체 솔루션으로서 간단하게 교환할 수 있습니다.ItemsControl와 함께ListBox:) , 이 퍼포먼스 최적화 페이지의 MSDN 를 확인해 주세요.ItemsControl"퍼포먼스 기능을 구현하는 제어" 표에 없습니다.이 때문에 컨트롤 템플릿을 편집해야 합니다.

다음은 DavidN의 답변을 바탕으로 ItemsControl을 사용하여 가상화할 수 있는 스타일입니다.

<!--Virtualised ItemsControl-->
<Style x:Key="ItemsControlVirtualizedStyle" TargetType="ItemsControl">
    <Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/>
    <Setter Property="ScrollViewer.CanContentScroll" Value="True"/>
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ItemsControl">
                <Border
                    BorderThickness="{TemplateBinding Border.BorderThickness}"
                    Padding="{TemplateBinding Control.Padding}"
                    BorderBrush="{TemplateBinding Border.BorderBrush}"
                    Background="{TemplateBinding Panel.Background}"
                    SnapsToDevicePixels="True"
                >
                    <ScrollViewer Padding="{TemplateBinding Control.Padding}" Focusable="False">
                        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

ListBox를 사용하면 반드시 필요하지 않은 행을 선택할 수 있기 때문에 ListBox를 사용하는 것은 좋지 않습니다.

단지 디폴트는ItemsPanel안 그래?VirtualizingStackPanel. 변경해야 합니다.

<ItemsControl>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

언급URL : https://stackoverflow.com/questions/2783845/virtualizing-an-itemscontrol

반응형