2014-02-18 79 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; 
}