2010-11-22 31 views
5

Điều gì có thể ngăn chặn TreeView khỏi ảo hóa nếu TreeView được thiết lập như sau?WPF: Ảo hóa TreeView không hoạt động

<TreeView 
    ItemsSource="{Binding}" 
    VirtualizingStackPanel.IsVirtualizing="True"> 
    <TreeView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel /> 
     </ItemsPanelTemplate> 
    </TreeView.ItemsPanel> 
    <TreeView.ItemContainerStyle> 
     <Style 
      TargetType="{x:Type TreeViewItem}"> 
      <Setter 
       Property="IsExpanded" 
       Value="{Binding IsExpanded, Mode=TwoWay}"/> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 

Tôi chưa ảo hóa, khi tôi mở rộng các nút (và sử dụng snoop để kiểm tra) tôi có tất cả TreeViewItems đang được tạo. Tôi tự hỏi nếu có một số sự kết hợp của container có thể ngăn chặn TreeView ảo hóa nội dung của nó. (ví dụ như lưu trữ nó trong một StackPanel)

+0

Bài đăng này có thể có một số trợ giúp trong tùy chỉnh ảo hóa: http://stackoverflow.com/questions/126230/resources-and-guides-to-ui-virtualization-in-wpf – Domokun

Trả lời

5

Vấn đề là với kiểu dáng. Sau một số nghiên cứu, chúng tôi thấy rằng có một phong cách chưa được đặt tên nhắm mục tiêu TreeView (ví dụ: một với DataType={x:Type TreeView} mà không có x:Key) và một cách nhắm mục tiêu TreeViewItem trong App.xaml (hoặc tương đương) của chúng tôi.

Các kiểu này không có trình kích hoạt để đặt ItemsPanel thành VirtualizingStackPanel và không đề cập đến bất kỳ ảo hóa nào. Khi các kiểu được loại bỏ, TreeView hoạt động tốt. Mặc dù các thuộc tính cục bộ đặt ItemsPanelVirtualizingStackPanel.Isvirtualizing="True" trên các TreeView các thuộc tính này không được chuyển sang TreeViewItems do đó cấp cao nhất của TreeView sẽ ảo hóa trong khi các danh mục phụ sẽ không (vì hành vi ảo hóa của chúng phụ thuộc vào TreeViewItem)