[英]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.