VirtualizingStackPanel이있는 TreeView가 있습니다. TreeView에는 "Level 1"TreeViewItem이 있고이 TreeViewItem을 10k 항목 목록에 바인딩합니다. 각 자식은 또 다른 TreeViewItem입니다.Wpf Xbap TreeView VirtualizingStackPanel 버그?
가상화가 잘 작동하고 성능이 뛰어 났지만 큰 문제가 있습니다. 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; }
}
내가 닷넷 4와 비주얼 스튜디오 2010을 사용 게다가 내가 _level2Template에서 TreeViewItem의 높이 & 폭을 설정하면 내가 통지를했다, 문제가 사라 졌어요. 그러나 높이를 설정하는 것은 내 경우에는 선택 사항이 아니기 때문에 높이는 실제 응용 프로그램에 따라 다릅니다.
업데이트 : 자식 treeviewitem의 높이가 다를 수 있으므로이 문제가 발생했습니다. 아마도 TreeView에서 VirtualizingStackPanel이 기본적으로 설정되어 있지 않지만 DataGrid & ListBox에서 기본적으로 설정되어있는 이유입니다. 말할 필요도없이 DataGrid 또는 ListBox 항목의 Height는 대개 변경되지 않습니다.
업데이트 : RadTreeView의 무료 평가판을 다운로드하고 가상화를 테스트했습니다. 이 문제는 telerik radtreeview에서 전혀 나타나지 않습니다. 테레 이크를 조금 더 테스트 한 다음 아마 그걸 가지고 시험해 볼 수 있습니다.