菜单依赖于订单

时间:2014-02-18 19:39:43

标签: c# wpf

您好我试图实现一个可以选择不同主题的菜单,但它在某种程度上有效,但是如果我选择的主题低于列表中的当前主题,我只能更改主题。

我一直关注此示例: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>

就像我说的,如果我点击的主题低于当前启用的主题,我只能更改主题。所以现在我可以去默认 - &gt;绿色 - &gt;红色 - &gt;我和我无法发现我的错误..

1 个答案:

答案 0 :(得分:0)

MenuItem的状态发生变化之前调用您的事件处理程序,并且if语句优先于菜单中视觉上较高的项目。

不要收听Menu事件,而是收听您拥有的各个Checked个实例的UncheckedMenuItem个事件。当然,您可以编写通用的OnCheckedOnUnchecked事件处理程序,并将所有4个MenuItem分配给同一个处理程序。

Checked状态发生更改后,UncheckedMenuItem事件会被引发,因此您的逻辑应该正确运行。

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;
}