0
votes

I have a TreeView with VirtualizingStackPanel on. The TreeView has a "Level 1" TreeViewItem, and I bind this TreeViewItem to a 10k items list. Each children is also another TreeViewItem.

Virtualization works well, and the performance is great, but there is a big issue. Let's say I am at the top of the page and press Ctrl-End to get to the bottom, browser goes blank. It will reappear if I scroll the mouse a bit or resize the browser.

Another big issue is: when i scroll very fast to the middle or the bottom of the tree. let's say I stop at item number 5000. Then I can't expand the child treeviewitem, the browser just shows nothing until I scroll or resize a bit.

Any help is very much appreciated. Below is the sample xaml & code:

<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; }
  }

I use Visual Studio 2010 with .Net 4. Plus I did notice if I set the Height & Width for the TreeViewItem under _level2Template, the issue is gone. But setting the Height is not an option in my case, cause the Height varies in the real Application.

Updated: It seems quite obvious to me that this issue happened because the height of the child treeviewitem may vary. Perhaps that's the reason why VirtualizingStackPanel is not turned on by default in TreeView, but it is turned on by default in DataGrid & ListBox. Needless to say the Height of a datagrid or listbox item is usually unchanged.

Updated: I downloaded a free trial of telerik RadTreeView and tested the virtualization. This problem does not appear at all in telerik radtreeview. May test the telerik one a little more then probably go with it then.

1

1 Answers

0
votes

Found this: TreeView Virtualization Same issue, and no solution for TreeView. Only way around is to use the ListBox instead of TreeView as suggested in http://www.beacosta.com/blog/?p=45

Pretty sure this is TreeView bug. I have tried Telerik RadTreeView and it also has its own bug when turn on Virtulization. I will change to use ListBox instead.