您好我试图实现一个可以选择不同主题的菜单,但它在某种程度上有效,但是如果我选择的主题低于列表中的当前主题,我只能更改主题。
我一直关注此示例: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;我和我无法发现我的错误..
答案 0 :(得分:0)
在MenuItem
的状态发生变化之前调用您的事件处理程序,并且if语句优先于菜单中视觉上较高的项目。
不要收听Menu
事件,而是收听您拥有的各个Checked
个实例的Unchecked
和MenuItem
个事件。当然,您可以编写通用的OnChecked
和OnUnchecked
事件处理程序,并将所有4个MenuItem
分配给同一个处理程序。
在Checked
状态发生更改后,Unchecked
和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;
}