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
'programing' 카테고리의 다른 글
| "shallow" 복사 사전을 업데이트하면 "original" 사전이 업데이트되지 않는 이유는 무엇입니까? (0) | 2023.04.19 |
|---|---|
| Postgre에 작은 따옴표로 텍스트를 삽입합니다.SQL (0) | 2023.04.19 |
| 블록으로 '셀프' 사이클 유지 (0) | 2023.04.19 |
| 어레이/어레이 목록에서 링크된 목록을 사용하는 경우 (0) | 2023.04.19 |
| ORA-01461: LONG 열에 삽입하는 경우에만 LONG 값을 바인딩할 수 있습니다. 쿼리 시 발생합니다. (0) | 2023.04.19 |