2012-06-11 72 views
3

我已經具備以下條件:如何以編程方式將訪問鍵(快捷鍵)添加到WPF ContextMenu?

var myContextMenu = new System.Windows.Controls.ContextMenu(); 

var exitItem = new MenuItem(); 
exitItem.Header = "E_xit"; 
exitItem.Item.Click += new RoutedEventHandler(new System.EventHandler(ExitProgram)); 
myContextMenu.Items.Add(exitItem); 

這使我的上下文菜單顯示退出菜單項,有下劃線的「X」。但是,按x不會執行任何操作。點擊菜單項可以正常工作。

如何將事件與x鍵關聯?請注意,這必須在我的上下文中以編程方式完成。我無法在前面的XAML中撰寫此解決方案。

+0

看看你是否可以通過ApplicationCommands類使用已經內建的WPF命令:http://msdn.microsoft.com/en-us/library/system.windows.input.applicationcommands.aspx – VS1

回答

1

的常用方法添加快捷方式如下:

var exitCommand = new RelayCommand(_ => ExitProgram()); 
     var exitItem = new MenuItem(); 
     exitItem.Header = "E_xit"; 
     exitItem.Command = exitCommand; 
     myContextMenu.Items.Add(exitItem); 

     InputBindings.Add(new KeyBinding(exitCommand, new KeyGesture(Key.X, ModifierKeys.Alt)); 

這裏使用的RelayCommand 類不是WPF的一部分,但它廣泛應用於基於MVVM的應用程式。

請注意,儘管如此,你不能在沒有修飾符的情況下設置X的快捷方式。從MSDN

報價在大多數情況下,必須KeyGesture與一種或多種 ModifierKeys相關聯。此規則的例外是功能鍵和數字小鍵盤按鍵,它們本身可以是有效的KeyGesture 。例如,您可以通過僅使用 F12鍵創建KeyGesture,但要在KeyGesture中使用X鍵,必須將其與 修飾鍵配對使用。

如果由於某種原因,你需要使用X W/O修飾符 - 你將不得不處理鍵盤事件(例如的KeyDown),並作出相應的反應

+0

這是非常常見的是在窗口中看到菜單(上下文菜單或文件菜單等),其中沒有修飾符的熱鍵。這些都嚴重地使用鍵盤事件嗎? –

+0

不能肯定地說,至少在WPF中使用InpupBindings是不可能的。無論如何,使用鍵盤事件很容易實現:private void mainWindow_PreviewKeyDown(object sender,System.Windows.Input.KeyEventArgs e){if(e.Key == System.Windows.Input.Key.X)App.Current.Shutdown (); } – olldman

0

這對我工作得很好:

using System.Windows; 
using System.Windows.Controls; 

namespace WpfApplication5 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      Loaded += new RoutedEventHandler(MainWindow_Loaded); 
     } 

     private void MainWindow_Loaded(object sender, RoutedEventArgs e) 
     { 
      // Create menu item. 
      MenuItem exitMenuItem = new MenuItem(); 
      exitMenuItem.Header = "E_xit"; 
      exitMenuItem.Click +=new RoutedEventHandler(exitMenuItem_Click); 

      // Create contextual menu. 
      ContextMenu contextMenu = new ContextMenu(); 
      contextMenu.Items.Add(exitMenuItem); 

      // Attach context-menu to something. 
      myButton.ContextMenu = contextMenu; // Assuming there's a button on window named "myButton". 
     } 

     public void exitMenuItem_Click(object sender, RoutedEventArgs e) 
     { 
      // This gets executed when user right-clicks button, and presses x down on their keyboard. 
      // TODO: Exit logic. 
     } 
    } 
} 


<Window x:Class="WpfApplication5.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow"> 
    <Grid> 
     <Button x:Name="myButton" /> 
    </Grid> 
</Window> 

當用戶右鍵單擊按鈕並在其鍵盤上按下「x」時,exitMenuItem_Click處理程序被執行。你沒有看到這種情況發生?

+0

正確,我沒看到這個。值得注意的是,在我的情況下,沒有窗口。我正在爲系統托盤圖標創建一個上下文菜單。 –

相關問題