Hôm nay tôi đã quyết định thử nghiệm TreeView ảo hóa. Để làm điều đó ràng buộc là bắt buộc. Vì vậy, tôi quyết định để có được 2 điều kiểm tra - HierarchicalDataTemplate dựa trên các loại + ảo hóa.Sự cố cuộn trong TreeView ảo hóa
Tôi đã tạo một lớp cơ sở cho một số dữ liệu. Đã tạo 2 lớp dẫn xuất từ lớp cơ sở. Thực hiện 2 HierarchicalDataTemplate (1 cho mỗi lớp dẫn xuất) để có được định dạng khác nhau của các nút. Và chạy dân số của 10k nút của 2 loại.
Lớp học:
public class ListItem_Generic
{
public string Name { get; protected set; }
public ListItem_Generic(string Name = "") { this.Name = Name; }
}
public class ListItem_Single : ListItem_Generic
{
public ListItem_Single(string Name = "") : base(Name) { }
}
public class ListItem_Multi : ListItem_Generic
{
public List<ListItem_Generic> Items { get; protected set; }
public ListItem_Multi(string Name = "", List<ListItem_Generic> Items = null)
: base(Name)
{
if (Items == null)
this.Items = new List<ListItem_Generic>();
else
this.Items = new List<ListItem_Generic>(Items);
}
}
Thế hệ của 10k hạch cấp 1 với một số trẻ em, ràng buộc:
public MainWindow()
{
InitializeComponent();
// Create a list of sample items and populate them
var lst = new List<ListItem_Generic>();
int MaxHeaders = 10000;
var rnd = new Random();
// Now generate 10 000 records. First select random amount of headers
int HeadersCount = rnd.Next(MaxHeaders);
for (int i = 0; i < HeadersCount; i++)
{
var Childrencount = rnd.Next(100);
var children = new List<ListItem_Generic>();
for (int j = 0; j < Childrencount; j++)
children.Add(new ListItem_Single("Child #"+j+" of parent #"+i));
lst.Add(new ListItem_Multi("Header #" + i + " (" + Childrencount + ")", children));
}
for (int i = 0; i < MaxHeaders - HeadersCount; i++)
lst.Add(new ListItem_Single("Line #" + i));
// Bind lstView to lst
lstView.ItemsSource = lst;
lstView.UpdateLayout();
}
XAML với HierarchicalDataTemplates:
<Window x:Class="Test_DataTemplates.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:loc="clr-namespace:Test_DataTemplates"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TreeView Name="lstView" VirtualizingPanel.IsVirtualizing="True">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type loc:ListItem_Multi}" ItemsSource="{Binding Path=Items}">
<Border Background="RosyBrown">
<TextBlock Text="{Binding Path=Name}" Foreground="White" FontWeight="Bold"/>
</Border>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type loc:ListItem_Single}">
<TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
</Grid>
</Window>
Mọi thứ hoạt động tinh:
- treeview được ảo hóa (dễ nhận biết bởi bộ nhớ + thời gian tải)
- Nodes có nguồn gốc từ các loại được định dạng chính xác
Tuy nhiên, khi di chuyển đến giả tiêu đề # 1000 và mở rộng nó - vị trí cuộn sẽ nhảy đến một số nơi khác làm cho nút mở rộng và các con của nó KHÔNG hiển thị.
Tôi đã làm gì sai? Có cách nào để sửa lỗi này không?
Cập nhật: Xóa ảo hóa cũng sẽ xóa lỗi cuộn.
liên quan: http://stackoverflow.com/questions/4074475/scrolling-bug-in-wpf-virtualized- treeview –
có vấn đề tương tự như ở đây – Laie
@ Jee-heonOh imho, TreeView không phải là quá phù hợp cho ảo hóa. Tôi khuyên bạn nên sử dụng ListBox/ListView để thay thế. Thật dễ dàng để mô phỏng chế độ xem dạng cây thông qua các mẫu và mô phỏng việc mở rộng/thu hẹp cấp bằng cách thêm/xóa các phần tử vào/từ danh sách đồng bộ (có thể quan sát). Có nhiều ví dụ có sẵn của TreeListView. Nếu bạn có xu hướng sử dụng TreeView (lưu ý rằng nó có thể ảo hóa thứ bậc cấp bậc đầu tiên) - xem cách giải quyết trên trang web microsoft, được đăng bởi một trong những người đóng góp. Ông ghi đè một số sự kiện của treeviewitem để đưa nó vào xem theo yêu cầu, giải quyết vấn đề di chuyển. – user2274578