2014-02-18 42 views
0

你好我试图实现一个菜单,可以选择不同的主题,它在一定程度上起作用,但我只能改变主题,如果我选择的主题低于列表中的当前主题。菜单取决于订单

我一直在下面这个例子:http://msdn.microsoft.com/en-us/library/system.windows.forms.menuitem.checked%28v=vs.110%29.aspx

但它不工作。我一直在试图检查“发件人”对象很好,但它是什么,你居然比发件人?它是MenuItem的名称还是什么?我尝试过,但没有运气。

这是clickEvent代码:

 if (swTheme.IsChecked) 
     { 
      SetTheme(MainWindow.Themes.StarWars); 
      redTheme.IsChecked = false; 
      greenTheme.IsChecked = false; 
      defaultTheme.IsChecked = false; 
     } 
     else if (redTheme.IsChecked) 
     { 
      SetTheme(MainWindow.Themes.Red); 
      greenTheme.IsChecked = false; 
      swTheme.IsChecked = false; 
      defaultTheme.IsChecked = false; 
     } 
     else if (greenTheme.IsChecked) 
     { 
      SetTheme(MainWindow.Themes.Green); 
      redTheme.IsChecked = false; 
      swTheme.IsChecked = false; 
      defaultTheme.IsChecked = false; 
     } 
     else 
     { 
      defaultTheme.IsChecked = true; 
      SetTheme(MainWindow.Themes.Default); 
      redTheme.IsChecked = false; 
      greenTheme.IsChecked = false; 
      swTheme.IsChecked = false; 
     } 

这里是菜单中的XAML代码:

<MenuItem Header="Themes" Click="themeChoice"> 
       <MenuItem Name="defaultTheme" Header="Default" IsCheckable="True" IsChecked="True"/> 
       <MenuItem Name="greenTheme" Header="Green" IsCheckable="True" IsChecked="False"/> 
       <MenuItem Name="redTheme" Header="Red" IsCheckable="True" IsChecked="False"/> 
       <MenuItem Name="swTheme" Header="Star Wars" IsCheckable="True" IsChecked="False"/> 
      </MenuItem> 

就像我说的,如果主题我点击我只能改变主题低于当前启用的主题。所以现在我可以去默认 - >绿色 - >红色 - > sw,我不能发现我的错误。

回答

0

您的事件处理程序在MenuItem的状态被更改之前调用,并且您的if语句优先选择菜单中视觉上较高的项目。

而不是聆听Menu事件,请聆听您拥有的个人MenuItem实例的CheckedUnchecked事件。当然,您可以编写通用的OnCheckedOnUnchecked事件处理程序,并将所有4个MenuItem分配给相同的处理程序。

CheckedUnchecked事件在MenuItem状态已更改后引发,因此您的逻辑应该正确地通过。

void MenuItemChecked(object sender, RoutedEventArgs e) 
{ 
    var menuItem = e.OriginalSource as MenuItem; 

    // Uncheck all other items 
    ... 

    // Change theme to what the current menu item specifies 
    ... 

    // Mark the event handled 
    e.Handled = true; 
}