2011-01-13 61 views
2

我发现上下文菜单需要10秒钟以上显示,当我有10000个项目时,我想让这个更快(例如小于1秒)WPF contextmenu很慢很多项目 - 我如何加快速度?

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

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也显著。

+6

你为什么做不可用上下文菜单? – SLaks 2011-01-13 22:45:51

+2

准确地说,我的想法...菜单大致可以处理9个项目。在这里填充10K物品不仅是无稽之谈,它是疯狂的。 – Joey 2011-01-13 22:46:58

回答

7

这将是一个糟糕的用户体验,在单个级别上有1k个项目,但如何使大量\昂贵的项目更灵敏的上下文菜单是一个公平的问题。

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

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

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

再次在根目录中有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; 
相关问题