2010-01-20 21 views
14

我的WPF应用程序具有由功能键触发的行为(F1 - F12)。在WPF中检测到用户按下F10

我的代码是沿着这些线路:

private void Window_KeyDown(object sender, KeyEventArgs e) 
{ 
    switch (e.Key) 
    { 
     case Key.F1: 
     ... 
     case Key.F2: 
     ... 
    } 
} 

这适用于所有的F键除了F10。调试时,我发现e.Key == Key.System当用户按下F10

在枚举定义中,F10 = 99System = 156,所以我可以排除它是一个重复的枚举值(如PageDown = Next = 20)。

那么,如何判断用户何时按下F10

是否安全地检查Key.System而不是?这感觉有点肮脏 - 有可能Key.System永远会因其他键被按下而产生吗?或者是否有某些设置会使F10报告为Key.F10

回答

15

除了Yacoder的响应,使用以下方法来检查的F10键:

case Key.System: 
    if (e.SystemKey == Key.F10) 
    { 
    // logic... 
    } 

SystemKey属性会告诉你哪个系统键被按下。

+0

这很酷。我发现我还必须在'e.Key == Key.System'时设置'e.Handled = true',以确保焦点不会留在控制箱上。 (当我使用'WindowStyle = None'时,控制盒在我的应用程序中是不可见的,这使得用户对默认的F10行为更加困惑。)另外,当用户按下“e.Key == Key.System” Alt键 - 也许在其他一些情况下 - 所以'e.SystemKey'绝对是取代F10的前提。谢谢! – teedyay 2010-01-21 10:08:49

1

答案用的DataContext:

 


    public partial class BankView : UserControl 
    { 
     public BankView() 
     { 
      InitializeComponent(); 

      this.KeyDown += new KeyEventHandler(BankView_KeyDown); 
     } 

     private void BankView_KeyDown(object sender, KeyEventArgs e) 
     { 
      try 
      { 
       switch (e.Key) 
       { 
        case Key.F4: 
         ((BankViewModel)DataContext).OpenAccount(); 
         break; 
       } 
      } 
      catch (Exception ex) 
      { 
       ... 
      } 
     } 

-1

这为我工作,为F1

Private Sub Window_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown 
    If (e.Key = Key.F1) Then 
     ShowHelp() 
    End If 
End Sub