2012-06-28 3 views
1

XAML에 정의 된 중첩 된 상황에 맞는 메뉴가있는 이미지 (아래 참조)가 있습니다.WPF 코드에서 중첩 된 메뉴 항목을 찾습니다.

for 루프를 사용하여 메뉴를 찾고 IsChecked = false를 사용하여 선택을 해제하려고합니다.

for (int i = 1; i <= 16; i++) 
     { 
      MenuItem theMenu = (MenuItem)this.FindName("beat" + i.ToString()); 
      theMenu.IsChecked = false; 
     } 

위에서 작동하지 않고 널 (null)을 반환 다음과 같이

내 코드입니다.

무엇이 잘못 되었나요? XAML

<Image x:Name="Options" Height="35" Source="Images/pad-options-button.png" Stretch="Fill" Width="47" Canvas.Left="740" Canvas.Top="293" 
      MouseUp="Options_MouseUp"> 
     <Image.ContextMenu> 
    <ContextMenu> 
     <MenuItem Header="Beats"> 
      <MenuItem Name="beat1" Header="1" Click="MenuBeats_Click"/> 
      <MenuItem Name="beat2" Header="2" Click="MenuBeats_Click"/> 
      <MenuItem Name="beat3" Header="3" Click="MenuBeats_Click"/> 
      <MenuItem Name="beat4" Header="4" Click="MenuBeats_Click"/> 
      <MenuItem Name="beat5" Header="5" Click="MenuBeats_Click"/> 
      <MenuItem Name="beat6" Header="6" Click="MenuBeats_Click"/> 
      <MenuItem Name="beat7" Header="7" Click="MenuBeats_Click"/> 
      <MenuItem Name="beat8" Header="8" Click="MenuBeats_Click"/>/> 
      <MenuItem Name="beat9" Header="9" Click="MenuBeats_Click"/> 
      <MenuItem Name="beat10" Header="10" Click="MenuBeats_Click"/> 
      <MenuItem Name="beat11" Header="11" Click="MenuBeats_Click"/> 
      <MenuItem Name="beat12" Header="12" Click="MenuBeats_Click"/> 
      <MenuItem Name="beat13" Header="13" Click="MenuBeats_Click"/> 
      <MenuItem Name="beat14" Header="14" Click="MenuBeats_Click"/> 
      <MenuItem Name="beat15" Header="15" Click="MenuBeats_Click"/> 
      <MenuItem Name="beat16" Header="16" Click="MenuBeats_Click"/> 
     </MenuItem> 
     <MenuItem Header="Beat Type"> 
      <MenuItem Name="Whole" Header="Whole" Click="MenuBeatType_Click"/> 
      <MenuItem Name ="Half" Header="Half" Click="MenuBeatType_Click"/> 
      <MenuItem Name ="Quarter" Header="Quarter" Click="MenuBeatType_Click"/> 
      <MenuItem Name ="Eighth" Header="Eighth" Click="MenuBeatType_Click"/> 
      <MenuItem Name ="Sixteenth" Header="Sixteenth" Click="MenuBeatType_Click"/> 
     </MenuItem> 
    </ContextMenu> 
</Image.ContextMenu> 
    </Image> 
</Canvas> 
+0

여기서 for 루프를 실행하고 거기에 'this'가 무엇입니까? –

+0

코드는 사용자 정의 컨트롤의 코드 측에서 실행됩니다. 내가 "이"usercontrol 자체를 디버깅 할 때. 문제의 이미지를 지적 할 가치가있는 것은 캔버스 안에 있습니다. –

답변

1

다른 옵션은 이미지에서 상황에 맞는 메뉴를 가져 오는 것입니다.

var items = Options.ContextMenu.Items 
foreach(MenuItem item in items) 
{ 
    // do your work with the item 
} 

하위 항목을 처리해야합니다. 아이템에는 케이스에 2 개의 아이템 만 있습니다.

+0

부모로부터 하위 메뉴를 참조하려면 어떻게해야합니까? 죄송합니다, 어린이 컬렉션이있는 winforms에서 작업하는 데 익숙해졌습니다. –

+0

위에서 설명한대로 ... 옵션은 이미지의 이름이므로 이것이 작동해야합니다. 당신이해야 할 일은 아마도 ".의 ContextMenu에의 ContextMenu 것은 "당신은 약간 명시 적으로 몇 항목을 이름으로 XAML을 변경 한 후 개인 무효 MenuBeats_Click (개체를 보낸 사람, RoutedEventArgs e)에 MenuBeats에서 { foreach는 (MenuItem의 항목 아래를 사용하는 항목을 재산 –

+0

에 액세스 할 수 있습니다 bevore .Items) { item.IsChecked = 거짓; } 의 MenuItem theSelectedMenu가 = (MenuItem의) 송신기; theSelectedMenu.IsChecked = TRUE;} –

0

에서

발췌 당신은 잘못된 마크 업이있다. 마지막 두 문자가 안 : 그냥 생성자에서

"/>"

+0

죄송합니다, 붙여 넣기 오류가 있습니다. 잘못된 종료 태그를 제거하고 theMenu 변수가 여전히 null을 반환합니다. –

0

:

<MenuItem Name="beat8" Header="8" Click="MenuBeats_Click"/>/> 

그러나, 예를 완벽하게 나를 위해 작동하지만, 실수로 항목과 뒤에 코드에서 코드의 쓰기 NameScope.SetNameScope(contextMenu, NameScope.GetNameScope(this)); contextMenu 이미지의 컨텍스트 메뉴에 주어진 이름입니다. 사실 ContextMenu는 비주얼 트리의 일부가 아니므로 이름을 찾을 수 없습니다. 위의 코드 줄은 시각적 트리의 범위에 컨텍스트 메뉴를 설정하므로 이름을 찾을 수 있습니다. 희망이 도움이 될 것입니다.

+0

안녕하세요, 해당 코드 줄을 추가하고 런타임 오류가 발생합니다. 값 매개 변수는 null 일 수 없습니다 (ContextMenu). ContextMenu가 XAML의 메뉴 이름이 아닌 것으로 가정합니다. –

+0

contextMenu는 x : Name = "contextMenu"와 같은 xaml 컨텍스트 메뉴의 이름입니다. ContextMenu 유형입니다. – ethicallogics

+1

'contextMenu'는 ContextMenu 이름이어야하며 소문자로 시작해야하므로 오류가 발생하지 않아야합니다. 주먹 서한의 대소 문자. –

관련 문제