У меня есть 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 один, потом, возможно, пойду с этим.