gpt4 book ai didi

c# - WPF contextmenu 有很多项目很慢 - 我怎样才能加快速度?

转载 作者:行者123 更新时间:2023-11-30 14:18:19 25 4
gpt4 key购买 nike

我发现当我有 10,000 个项目时,上下文菜单需要超过 10 秒才能显示,我想让它更快(例如少于 1 秒)

这是我的测试代码,直接显示上下文菜单缓慢:

private void button1_Click(object sender, RoutedEventArgs e)
{
ContextMenu cm = new ContextMenu();

for (int i = 0; i < 1000; i++)
{
MenuItem mi = new MenuItem();
mi.Header = "test"; // this is HOT - 3%
mi.Tag = this; // cold
for (int j = 0; j < 10; j++)
{
MenuItem mi2 = new MenuItem(); // this is HOT - 1%
mi2.Header = "test"; // this is HOT - 12%
mi2.Tag = this; // cold
mi.Items.Add(mi2); // this is HOT - 6%
}
cm.Items.Add(mi); // this is HOT - 3%
}
cm.IsOpen = true; // this is HOT - 72%
}

根据我使用的性能分析器,cm.IsOpen 占用了大部分时间 - 但设置 mi.Header 也很重要。

最佳答案

在单个级别拥有 1000 个项目将是糟糕的用户体验,但如何使包含大量\昂贵项目的上下文菜单更具响应性,是一个公平的问题。

我使用的一般模式是最初使用虚拟子菜单创建我的菜单。虚拟子菜单有一个占位符菜单项,我 Hook 子菜单打开事件。在事件处理程序中,我删除了占位符菜单项并添加了真正的项目。

此模式允许按需创建子菜单,并且仅当子菜单实际打开时才创建。换句话说,它使您的菜单动态化,这意味着您不必预先创建所有内容,也不必创建数百个不会打开的子菜单。

对于上面的示例,此模式会将您的初始菜单项数量从 10k 项减少到 1k。这应该让您缩短到约 1 秒。

再一次,10k 个菜单项在根目录中有 1k 个在用户体验方面几乎是不可用的。我希望这只是一个思想实验! :)

示例

        ContextMenu cm = new ContextMenu();

for (int i = 0; i < 1000; i++)
{
MenuItem mi = new MenuItem();
mi.Header = "test";
mi.Tag = this;

object dummySub = new object();
mi.Items.Add(dummySub);
cm.Items.Add(mi);

mi.SubmenuOpened += delegate
{
mi.Items.Clear();

for (int j = 0; j < 10; j++)
{
MenuItem mi2 = new MenuItem();
mi2.Header = "test";
mi2.Tag = this;
mi.Items.Add(mi2);
}
};
}

cm.IsOpen = true;

关于c# - WPF contextmenu 有很多项目很慢 - 我怎样才能加快速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4686182/

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