VirtualizingStackPanel をオンにした TreeView があります。TreeView には「レベル 1」の TreeViewItem があり、この TreeViewItem を 10k 項目リストにバインドします。各子は別の TreeViewItem でもあります。
仮想化はうまく機能し、パフォーマンスも優れていますが、大きな問題があります。私がページの上部にいて、Ctrl-End を押して下部に移動すると、ブラウザが空白になるとしましょう。マウスを少しスクロールするか、ブラウザのサイズを変更すると、再び表示されます。
もう1つの大きな問題は、ツリーの中央または下部まで非常に速くスクロールするときです。アイテム番号5000で停止するとしましょう。その後、子ツリービューアイテムを展開できません.ブラウザは、スクロールするかサイズを少し変更するまで何も表示しません.
どんな助けでも大歓迎です。以下は、サンプルの 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; }
}
.Net 4 で Visual Studio 2010 を使用しています。さらに、_level2Template の下で TreeViewItem の高さと幅を設定すると、問題が解決したことに気付きました。ただし、私の場合、高さを設定することはオプションではありません。実際のアプリケーションでは高さが異なるためです。
更新:子ツリービューアイテムの高さが異なる可能性があるため、この問題が発生したことは明らかです。おそらくそれが、TreeView では VirtualizingStackPanel がデフォルトでオンになっていないのに、DataGrid と ListBox ではデフォルトでオンになっている理由です。言うまでもなく、データグリッドまたはリストボックス項目の高さは通常変更されません。
更新: telerik RadTreeView の無料試用版をダウンロードし、仮想化をテストしました。この問題は、telek radtreeview ではまったく発生しません。テレリックをもう少しテストしてから、おそらくそれを使用してください。