2011-11-23 3 views
0

선택할 수있는 항목 (MenuItem)이있는 일부 하위 메뉴가있는 ContextMenu가 있습니다. ContextMenu가 열리면 현재 선택된 항목을 재귀 적으로 열려고합니다. 따라서 다음 코드를 가지고 있습니다..NET MenuItem.IsSubmenuOpen = true는 처음에만 작동합니다.

protected override void OnOpened(RoutedEventArgs e) { 
     base.OnOpened(e); 
     OpenCurrentSubMenu(Items); 
    } 

    private static bool OpenCurrentSubMenu(ItemCollection itemCollection) { 
     foreach (MenuItem item in itemCollection) { 
      if (item.IsChecked) { 
       return true; 
      } 
      else if(OpenCurrentSubMenu(item.Items)) { 
       item.IsSubmenuOpen = true; 
       return true; 
      } 
     } 
     return false; 
    } 

또한 하나의 항목 만 선택되도록하는 다른 코드가 있습니다.

이것은 하위 메뉴에서 항목을 처음 선택할 때 크게 효과가있는 것 같습니다.

그러나 First Drop-down

, I이 2 번 그것을 다시 열 컨텍스트 메뉴를두고, 선택된 메뉴 : I이 때의 ContextMenu, 선택된 항목에 개방 개방 하위 메뉴 캐스케이드를 다시 열어 열지 않습니다

Next Drop-down

는 아는 사람 있나요 왜, 어떻게 그것을 해결하기 위해?

+0

제목에 "IsItemChecked"가 표시되지만 코드에 "IsSubmenuOpen"이 표시됩니다. –

+0

@ScottRippey - 업데이트 감사. – DiamondBack

+0

더 많은 레벨의 메뉴로 이것을 테스트 할 수 있습니까? 각각 다시 열면 다시 열 수있는 수준이 낮습니까? 아니면 항상 최종 메뉴가 열리지 않습니까? –

답변

3

세 가지 시도 : 상황에 맞는 메뉴를 열

  • , 전체 계층 구조를 통해 같이 Recurse 및 설정 IsSubmenuOpen = 거짓 당신이 어떤 하위 메뉴를 열기 전에. 이전에 열었던 하위 메뉴가 기억되어 있으므로 같은 레벨에 두 개의 열린 하위 메뉴가 있음을 알리려는 것일 수 있습니다.

  • 재귀를 열어서 열어야하는 하위 메뉴를 찾아 목록에 저장하십시오. 그런 다음 목록을 반복하여 하위 하위 메뉴가 열려 있기 전에 최상위 메뉴가 열린 상태로 설정되도록 설정합니다. (부모가 아직 열리지 않은 상태에서 아이를 열려고해도 항상 안정적으로 작동하지는 않습니다.)

  • 까다로운 접근 방식 : 컨텍스트 메뉴가 열릴 때마다 삭제하고 다시 만드십시오. 좋은 것은 아니지만 상황에 맞는 메뉴를 열면 성능에 미치는 영향에 대해 걱정할 것입니다. 그리고 그것이 처음으로 작동하는 것처럼 보입니다. 매번 처음 만들 때입니다.

+0

좋은 조언. 몇 가지 변형을 시도했습니다 : Scott Rippey의 방법을 시도했습니다. 또한 IsSubmenuOpen = false를 Close에 설정해 보았습니다. 아무 소용이 없었습니다. 두 번째 글 머리 기호는 흥미 롭지 만 캐스케이드가 처음으로 작동하는 이유는 설명하지 않지만 다음과 같은 경우는 설명하지 않습니다.브 루트 포스는 항상 옵션입니다. – DiamondBack

+0

두 번째 옵션은 트릭을 수행하는 것으로 보입니다.하지만 캐스케이드가 처음으로 작동하는 이유를 아직 설명하지는 않습니다. ! @ * $ # MS .NET – DiamondBack

+1

일부 정보는 첫 번째 시도에서 캐시되지 않으므로 메뉴를 열 때 어떤 순서로든 작동하지만 나중에 메뉴 시스템이 계층 구조 나 상태에 대해 "더 많이"알게됩니다. 기존 메뉴 항목을 변경하여 사물을 변경하려는 시도에 혼동을줍니다. –

1

true으로 다시 설정하기 전에 값을 false으로 설정하는 것이 도움이 될 수 있습니다. 나는 이것을 확인할 수 없다.

item.IsSubmenuOpen = false; 
item.IsSubmenuOpen = true; 
+0

팁을 주셔서 감사합니다, 스캇. 이전에 .NET 문제에 대한 비슷한 솔루션을 보았으며 유망한 것으로 보였습니다. 불행히도,이 경우에는 작동하지 않습니다. – DiamondBack

0

로직이 잘 작동해야한다고 생각합니다. 메뉴 항목이 선택되었을 때,하지만 하위 메뉴 항목이 선택 될 때가 아닙니다. 내 의견으로는 두 개의 루프를 시도해보십시오 .... 하나는 메뉴 용이고 다른 하나는 하위 메뉴 항목 용입니다.

관련 문제