2011-03-14 2 views
0

VirtualizingStackPanel이있는 TreeView가 있습니다. TreeView에는 "Level 1"TreeViewItem이 있고이 TreeViewItem을 10k 항목 목록에 바인딩합니다. 각 자식은 또 다른 TreeViewItem입니다.Wpf Xbap TreeView VirtualizingStackPanel 버그?

가상화가 잘 작동하고 성능이 뛰어 났지만 큰 문제가 있습니다. Ctrl + End 키를 눌러 페이지 하단에 도달하면 브라우저가 공백으로 표시됩니다. 마우스를 약간 스크롤하거나 브라우저의 크기를 조정하면 다시 나타납니다.

다른 중요한 문제는 다음과 같습니다. 나무의 중간 또는 아래쪽으로 매우 빠르게 스크롤 할 때. 내가 아이템 번호 5000에서 멈춘다 고 가정 해 봅시다. 그러면 자식 treeviewitem을 확장 할 수 없습니다. 브라우저는 단지 에 스크롤하거나 크기를 조정할 때까지 아무것도 표시하지 않습니다.

모든 도움을 주시면 대단히 감사하겠습니다. 아래는 샘플 XAML & 코드 :

<Page x:Class="WpfBrowserApplication3.Page1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:s="clr-namespace:WpfBrowserApplication3" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300" 
     Title="Page1" DataContext="{StaticResource _mainViewModel}"> 
    <Page.Resources> 
    <s:SingleToCollectionConverter x:Key="_collectionConverter"></s:SingleToCollectionConverter> 
    <DataTemplate x:Key="_level2Template"> 
     <TreeViewItem Header="{Binding Order}"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="Order: "></TextBlock> 
      <TextBox Text="{Binding Order}"></TextBox> 
     </StackPanel> 
     </TreeViewItem> 
    </DataTemplate> 
    </Page.Resources> 
    <TreeView VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Standard">  
    <TreeViewItem Header="Level 1" ItemsSource="{Binding Level2List}" ItemTemplate="{StaticResource _level2Template}"></TreeViewItem>  
    </TreeView> 
</Page> 

    public class MainViewModel 
    { 
    public MainViewModel() 
    { 
     Level2List = new List<Level2>(); 
     for (int i = 0; i < 10000; i++) 
     { 
     Level2List.Add(new Level2(i)); 
     } 
    } 

    public List<Level2> Level2List { get; set; } 
    } 

    public class Level2 
    { 
    public Level2(int order) 
    { 
     Order = order; 
    } 

    public int Order { get; set; } 
    } 

내가 닷넷 4와 비주얼 스튜디오 2010을 사용 게다가 내가 _level2Template에서 TreeViewItem의 높이 & 폭을 설정하면 내가 통지를했다, 문제가 사라 졌어요. 그러나 높이를 설정하는 것은 내 경우에는 선택 사항이 아니기 때문에 높이는 실제 응용 프로그램에 따라 다릅니다.

업데이트 : 자식 treeviewitem의 높이가 다를 수 있으므로이 문제가 발생했습니다. 아마도 TreeView에서 VirtualizingStackPanel이 기본적으로 설정되어 있지 않지만 DataGrid & ListBox에서 기본적으로 설정되어있는 이유입니다. 말할 필요도없이 DataGrid 또는 ListBox 항목의 Height는 대개 변경되지 않습니다.

업데이트 : RadTreeView의 무료 평가판을 다운로드하고 가상화를 테스트했습니다. 이 문제는 telerik radtreeview에서 전혀 나타나지 않습니다. 테레 이크를 조금 더 테스트 한 다음 아마 그걸 가지고 시험해 볼 수 있습니다.

답변

0

발견 : TreeView Virtualization 동일한 문제이며 TreeView에 대한 해결책이 없습니다. 유일한 방법은 ListBox 대신 ListBox를 사용하는 것입니다. http://www.beacosta.com/blog/?p=45

확실히 TreeView 버그입니다. Telerik RadTreeView를 사용해 보았고 버추얼 화를 켜면 자체 버그가 있습니다. 대신 ListBox를 사용하도록 변경합니다.