Обнаружение пользователя, нажимающего F10 в WPF

Мое приложение WPF имеет поведение, запускаемое функциональными клавишами (F1-F12).

Мой код выглядит следующим образом:

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 = 99 и System = 156, поэтому я могу исключить дублирование значения перечисления (например, PageDown = Next = 20).

Итак, как узнать, когда пользователь нажимает F10?

Безопасно ли вместо этого проверять Key.System? Это кажется немного грязным - возможно ли, что Key.System когда-либо возникнет в результате нажатия какой-либо другой клавиши? Или где-то есть какая-то настройка, которая заставит F10 сообщать как Key.F10?


person teedyay    schedule 20.01.2010    source источник


Ответы (4)


В дополнение к ответу Yacoder используйте следующее для проверки клавиши F10:

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

Свойство SystemKey сообщит вам, какой Была нажата системная клавиша.

person Will Eddins    schedule 20.01.2010
comment
Это классно. Я обнаружил, что мне также нужно установить e.Handled = true, когда e.Key == Key.System, чтобы фокус не оставался на блоке управления. (Панель управления невидим в моем приложении, поскольку я использую WindowStyle = None, что делает поведение F10 по умолчанию еще более запутанным для пользователя.) Кроме того, e.Key == Key.System, когда пользователь также нажимает клавишу Alt - и, возможно, в некоторых других случаях - поэтому e.SystemKey определенно подходит, а не просто предполагает, что это F10. Спасибо! - person teedyay; 21.01.2010

F10 открывает меню окна. Это одинаково во всех приложениях для Windows.

Кажется, что Key.System - это ожидаемое значение для клавиши F10.

person Max Galkin    schedule 20.01.2010

Ответ с 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)
            {
                ...
            }
        }

person RckLN    schedule 19.07.2012

Это сработало для меня, для 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
person kiev    schedule 01.10.2013