Wpf Xbap TreeView VirtualizingStackPanel错误?

时间:2011-03-14 05:58:07

标签: wpf treeview xbap virtualizingstackpanel

我有一个带有VirtualizingStackPanel的TreeView。 TreeView有一个“Level 1”TreeViewItem,我将这个TreeViewItem绑定到一个10k项目列表。每个孩子也是另一个TreeViewItem。

虚拟化运行良好,性能很好,但存在很大问题。假设我位于页面顶部并按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; }
  }

我使用Visual Studio 2010和.Net 4. Plus我确实注意到我是否设置了Height&amp; _level2Template下TreeViewItem的宽度,问题就消失了。但是在我的情况下设置高度不是一个选项,因为高度在实际应用程序中有所不同。

更新:对我来说很明显,这个问题的发生是因为儿童treeviewitem的高度可能会有所不同。也许这就是为什么默认情况下在TreeView中没有打开VirtualizingStackPanel的原因,但默认情况下它在DataGrid&amp;列表框。不用说,数据网格或列表框项的高度通常不变。

更新:我下载了telerik RadTreeView的免费试用版并测试了虚拟化。 telerik radtreeview中根本没有出现此问题。可能会稍微测试一下telerik,然后再用它来。

1 个答案:

答案 0 :(得分:0)

找到了这个:TreeView Virtualization 同样的问题,没有TreeView的解决方案。唯一的方法是使用ListBox而不是http://www.beacosta.com/blog/?p=45

中建议的TreeView

很确定这是TreeView错误。我已经尝试过Telerik RadTreeView,当打开Virtulization时它也有自己的bug。我将改为使用ListBox。