2015-02-05 2 views
1

ListBox를 여러 항목이 포함 된보기로 사용하려고합니다. 물론 UI 가상화를 사용해야합니다.UI 가상화를 Redefined ListBox 템플릿과 함께 사용하는 방법

<ListBox 
    ItemsSource="{Binding ItemsSource}" 
    VirtualizingStackPanel.IsVirtualizing="True" 
    VirtualizingStackPanel.VirtualizationMode="Recycling"> 

    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <views:SiteEntryView /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

하지만 그것을 사용자 정의하려고하면, 그것은 더 이상 가상화되지 않습니다 :

<ListBox 
    ItemsSource="{Binding ItemsSource}" 
    VirtualizingStackPanel.IsVirtualizing="True" 
    VirtualizingStackPanel.VirtualizationMode="Recycling"> 

    <ListBox.Template> 
     <ControlTemplate> 
      <ScrollViewer> 
       <ItemsPresenter /> 
      </ScrollViewer> 
     </ControlTemplate> 
    </ListBox.Template> 

    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 

    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <views:SiteEntryView /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

I 마찬가지로 지금까지

문제는 내가옵니다 이런 식으로 선언 할 때 가상화에만 작동입니다 발견 한이 샘플에는 기본적으로 ListBox에 포함 된 것과 동일한 내용 만 포함되어 있습니다. 그러나 가상화가 작동하지 않습니다. 여러 기사와 여기에 나온 몇 가지 답변을 읽었지만 여전히 "일반 방법"을 파악할 수 없습니다. 사용자 지정 템플릿을 사용하여 가상화 작업을 수행하기 위해 무엇을 설정하고 바인딩하고 추가해야합니까?

답변

2

ItemsPanelStackPanel을 사용하고있는 이유는 VirtualizingStackPanel (대신 ListBox의 기본 ItemsPanel)을 사용해야하기 때문입니다.

어느

ItemsPanel 정의를 제거하거나 VirtualizingStackPanel 사용하도록 수정 :

<ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
     <VirtualizingStackPanel /> 
    </ItemsPanelTemplate> 
</ListBox.ItemsPanel> 
+0

확실히 모두를했지만, 지금은 다시 시도하고 작동합니다. : \ 나는 전에 무엇이 잘못되었는지 궁금합니다. – yaapelsinko

1

두 가지를 :

업데이트합니다 PanelTemplateVirtualizingStackPanel를 사용하고 ControlTemplateScrollViewervirtualization 옵션을 추가 할 수 있습니다.

<ListBox.Template> 
    <ControlTemplate> 
     <ScrollViewer VirtualizingStackPanel.IsVirtualizing="True" 
         VirtualizingStackPanel.VirtualizationMode="Recycling"> 
      <ItemsPresenter /> 
     </ScrollViewer> 
    </ControlTemplate> 
</ListBox.Template> 

<ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
     <VirtualizingStackPanel /> 
    </ItemsPanelTemplate> 
</ListBox.ItemsPanel> 

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <views:SiteEntryView /> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

+0

그 속성은 ListBox 또는 ScrollViewer에서 작동합니다. 속성이 비주얼 트리의 루트에 설정 될 수 있다는 것을 의미합니까 (일부는 자식 트리에 루트로 나타나는 요소를 의미합니다), 아니면 WPF의 "자동"항목입니까? – yaapelsinko

+0

루트 ListBox 노드에서 제공 될 때 속성이 제대로 작동하지 않는다는 문제가 과거에 많이 발생했습니다 (실시간 데이터가 많음). 어디서 왔는지 잊어 버렸지 만 ControlTemplate 자체 내에서 설정해야한다고 명시된 블로그 게시물을 발견했습니다. 그 이후로 virutalizaiton이 더 잘 작동하고 있습니다. –