[英]WPF contextmenu is slow with many items - how can I speed it up?
我发现上下文菜单在有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也很重要。
在单个级别上具有1k项将是糟糕的用户体验,但是如何使包含大量\\昂贵项的上下文菜单更敏感,这是一个公平的问题。
我使用的一般模式是首先使用虚拟子菜单创建菜单。 虚拟子菜单有一个占位符菜单项,我钩住了子菜单打开事件。 在事件处理程序中,我删除了占位符菜单项并添加了真实项。
此模式允许按需创建子菜单,并且仅在实际打开子菜单时才可以创建。 换句话说,它使菜单变得动态,这意味着您不必先创建所有内容,也不必创建数百个不会打开的子菜单。
对于上述示例,此模式会将您的初始菜单项数从10k减少到1k。 这应该使您下降到〜1秒。
同样,在UX方面,以1k为根的10k菜单项几乎是不可用的。 我希望这只是一个思想实验! :)
例
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.