簡體   English   中英

WPF上下文菜單在很多項目上都很慢-如何加快速度?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM