gpt4 book ai didi

.net - WinForms ListView 和 TreeView : strange performance issues

转载 作者:行者123 更新时间:2023-12-02 02:19:02 25 4
gpt4 key购买 nike

在我们的项目中优化 UI 时,我注意到 ListView 中的提升非常奇怪,但不明白它从何而来。

简单地向 listView 添加 5000 个元素( View :列表)- 3815 毫秒:

for (int i = 0; i < 5000; i++)
listView1.Items.Add((Guid.NewGuid().ToString()));

使用 BeginUpdate() + EndUpdate() - 2317 毫秒:

listView1.BeginUpdate();
for (int i = 0; i < 5000; i++)
listView1.Items.Add((Guid.NewGuid().ToString()));
listView1.EndUpdate();

使用 Hide() + Show() - 163 毫秒(没有错误,快了 10 倍以上):

listView1.Hide();
for (int i = 0; i < 5000; i++)
listView1.Items.Add((Guid.NewGuid().ToString()));
listView1.Show();

风格也变了。 现在我有 4 列,而不是 2 列。

为什么这条路这么快?此外,为什么从隐藏的 ListView(可见:false)开始,并在填充后显示它没有相同的性能提升?

TreeView 不同。简单添加 5000 个节点 - 2130 毫秒:

for (int i = 0; i < 5000; i++)
treeView1.Nodes.Add((Guid.NewGuid().ToString()));

使用 Hide() + Show() - 1048 毫秒:

treeView1.Hide();
for (int i = 0; i < 5000; i++)
treeView1.Nodes.Add((Guid.NewGuid().ToString()));
treeView1.Show();

使用 BeginUpdate() + EndUpdate() - 291 毫秒:

treeView1.BeginUpdate();
for (int i = 0; i < 5000; i++)
treeView1.Nodes.Add((Guid.NewGuid().ToString()));
treeView1.EndUpdate();

最佳答案

这似乎是一个错误。当控件被隐藏时,它不会计算项目的范围(类似于 Graphics.MeasureString 或其 native 等效项)在添加时(这是有道理的)并且以后不会计算它,当显示控件时(这可能是一个错误)。由于这个原因,您得到 4 列而不是 2 列。请注意,当您得到 2 列时,项目不会被截断,因为执行了此大小计算。当你得到 4 列时,显示通常是不正确的。

为什么它不能从一开始就隐身呢?原因是,因为在这种情况下,在您调用 Show 方法或进行任何强制创建句柄的操作之前,不会创建控件的句柄(尚未创建底层 Win32 控件)。然后,Show 将第一次创建句柄,执行许多其他代码,包括 OnHandleCreated 并且代码在此时组织项目并计算它们的大小.

您可以检查 IsHandleCreated 属性是否为 false,直到第一次 Show 调用,如果控件从一开始就是不可见的。

您还可以显式创建一个句柄,即。通过简单地尝试读取 Handle 属性(这会强制创建句柄),然后它的行为方式相同 - 速度很快,但显示错误:

IntPtr handle = listView1.Handle;
for (int i = 0; i < 5000; i++)
listView1.Items.Add((Guid.NewGuid().ToString()));
listView1.Show();

如果句柄较早创建,OnHandleCreated 也会调用大小计算,但此时列表为空。

关于.net - WinForms ListView 和 TreeView : strange performance issues,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9173150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com