2011-01-13 9 views
2

10,000 개의 항목이있을 때 컨텍스트 메뉴가 표시되는 데 10 초 이상 걸렸으므로이 방법을 더 빨리 수행하고 싶습니다 (예 : 1 초 미만)WPF 컨텍스트 메뉴가 많은 항목에서 느립니다. 어떻게 속도를 높일 수 있습니까?

다음은 컨텍스트를 보여주는 테스트 코드입니다. 직접 메뉴 느림 :

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

+2

정확히 내 생각은 메뉴가 대략 9 개 항목까지 잘 작동합니다. 10k 항목을 채우는 것은 넌센스 일뿐 아니라 미친 짓입니다. – Joey

+2

Woah, 컨텍스트 메뉴에 10000 개 항목, 나는 컨텍스트 메뉴를 싫어했을 것이다. – Gabe

답변

7

단일 레벨에서 1k 개의 항목을 갖는 사용자 경험이 좋지 않지만, 많은 비용이 드는 항목이있는 상황에 맞는 메뉴를 만드는 방법은 공정한 질문입니다.

내가 사용하는 일반적인 패턴은 처음에는 더미 하위 메뉴로 내 메뉴를 만드는 것입니다. 더미 하위 메뉴에는 하나의 자리 표시 자 메뉴 항목이 있으며 하위 메뉴 열기 이벤트를 연결합니다. 이벤트 처리기에서 자리 표시 자 메뉴 항목을 제거하고 실제 항목을 추가합니다.

이 패턴을 사용하면 하위 메뉴가 실제로 열릴 때만 필요에 따라 하위 메뉴를 만들 수 있습니다. 즉, 메뉴를 동적으로 만들어서 모든 것을 미리 만들 필요가 없으며 열리지 않는 수백 개의 하위 메뉴를 만들 수 있습니다.

이 패턴을 사용하면 위의 예에서 초기 메뉴 항목 수가 10k 항목에서 1k로 감소합니다. 이것은 ~ 1 초까지 내려야합니다.

다시 1k가 루트에있는 10k 메뉴 항목은 UX 측면에서 거의 사용이 불가능합니다. 나는 이것이 단지 생각의 실험 일 뿐이라고 희망한다! :)

 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; 
+0

네, 이렇게하면 훨씬 빨라집니다. 너무 많은 항목에 대한 이유는 제 통제 범위를 벗어납니다. @ 조이는 너무 많은 수준을 피하는 것이 좋다는 데 동의합니다. 다행스럽게도 사용자가 더 빨리 작업하게되면 사용자는 불편 함을 느끼고 대신 실용성에 대해 불만을 터트 리며 변경을 선택하게됩니다. – Lance

+0

@Lance 흥미로운 상황 인 것 같습니다. 도와 줘서 기뻐. :) –

+0

@chibacity : 역동적 인 하위 메뉴 생성의 좋은 예를 보여 주셔서 감사합니다! –

관련 문제