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 |