sách gpt4 ăn đã đi

c# - 虚拟化 TreeView 中的滚动问题

In lại 作者:太空狗 更新时间:2023-10-29 17:59:29 27 4
mua khóa gpt4 giày nike

今天我决定最终尝试虚拟化 TreeView。要做到这一点,绑定(bind)是必需的。所以我决定测试两件事——基于类型的 HierarchicalDataTemplate + 虚拟化。

我为一些数据创建了一个基类。从基类创建了 2 个派生类。制作了 2 个 HierarchicalDataTemplate(每个派生类 1 个)以获得不同格式的节点。以及 2 种类型的 10k 节点的运行种群。

loại:

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 Items { get; protected set; }
public ListItem_Multi(string Name = "", List Items = null)
: base(Name)
{
if (Items == null)
this.Items = new List();
khác
this.Items = new List(Items);
}
}

生成 10k 一级节点和一些子节点,绑定(bind):

    public MainWindow()
{
InitializeComponent();

// Create a list of sample items and populate them
var lst = new List();

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();
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();
}

带有 HierarchicalDataTemplates 的 XAML:


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">















一切正常:

  • treeview 被虚拟化(通过内存占用和加载时间很容易注意到)
  • 派生自类型的节点格式正确

但是,当滚动到标题 #1000 并展开它时 - 滚动位置会跳到其他地方,使展开的节点及其子节点不可见。

我做错了什么?有什么办法可以解决这个问题吗?

更新:移除虚拟化也会移除滚动错误。

câu trả lời hay nhất

在 C# WPF 中的树虚拟化出现许多问题(包括主要问题,即只有第一层被虚拟化)之后 - 我无法找到合适的修复方法。 Microsoft 接受了错误报告并回答说,滚动问题将在未来的一个版本中得到修复。

至于我个人的最终解决方案 - 我已经切换到自己的 ListTreeView 实现,即使用 List 和模拟树。这解决了虚拟化和滚动行为的所有问题。唯一的问题是 - 在折叠树节点后删除了许多项目。我必须实现检查是否更容易/更快地重新创建一个新列表而不是逐一删除项目。

关于c# - 虚拟化 TreeView 中的滚动问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15972901/

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress