Wpf Xbap TreeView Ошибка VirtualizingStackPanel? - PullRequest
0 голосов
/ 14 марта 2011

У меня есть TreeView с VirtualizingStackPanel.TreeView имеет TreeViewItem "уровня 1", и я связываю этот TreeViewItem со списком из 10 тыс. Элементов.У каждого потомка есть еще один TreeViewItem.

Виртуализация работает хорошо, производительность отличная, но есть большая проблема.Допустим, я нахожусь в верхней части страницы и нажимаю Ctrl-End, чтобы добраться до нижней части, браузер гаснет.Он появится снова, если я немного прокручиваю мышь или изменяю размер браузера.

Еще одна большая проблема: когда я очень быстро прокручиваюсь к середине или нижней части дерева.скажем, я остановлюсь на позиции номер 5000. Тогда я не могу развернуть дочерний элемент дерева, браузер просто ничего не показывает, пока я не прокручиваю или не изменяю размер.

Любая помощь очень ценится.Ниже приведен пример 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; }
  }

. Я использую Visual Studio 2010 с .Net 4. Кроме того, я заметил, что при установке высоты и ширины для TreeViewItem в _level2Template проблема исчезла.Но установка высоты не является вариантом в моем случае, потому что высота изменяется в реальном приложении.

Обновлено: мне кажется совершенно очевидным, что эта проблема произошла, потому что высота дочернего элемента дерева может изменяться.Возможно, именно поэтому VirtualizingStackPanel не включен по умолчанию в TreeView, но он включен по умолчанию в DataGrid и ListBox.Само собой разумеется, что высота сетки данных или элемента списка обычно не изменяется.

Обновлено: я скачал бесплатную пробную версию telerik RadTreeView и протестировал виртуализацию.Эта проблема вообще не появляется в telerik radtreeview.Может, еще раз протестирую telerik один, потом, возможно, пойду с этим.

1 Ответ

0 голосов
/ 17 марта 2011

Обнаружено это: TreeView Virtualization Та же проблема, но нет решения для TreeView.Единственным выходом из ситуации является использование ListBox вместо TreeView, как предложено в http://www.beacosta.com/blog/?p=45

Почти наверняка это ошибка TreeView.Я пробовал Telerik RadTreeView, и он также имеет свою собственную ошибку при включении Virtulization.Вместо этого я буду использовать ListBox.

...