Есть ли класс .NET для горячих клавиш, который можно сопоставить с входящим KeyEventArgs? - PullRequest
3 голосов
/ 03 февраля 2012

В основном у меня загруженный класс во время выполнения, который выглядит так:

[Plugin("Plugin name")]
class PluginActions
{
  [Action("Flip Normals")
  public void FlipNormals()
  {
    // code ....
  }

  [Action("Export .X object")
  public void ExportX()
  {
    // code ....
  }
}

Это в основном добавляет кнопки в форму с настроенными обработчиками событий onClick.

Теперь я хотел бы указать горячие клавиши в том же стиле, используя атрибуты:

[Plugin("Plugin name")]
class PluginActions
{
  [Action("Flip Normals", Hotkey = "Ctrl+N")
  public void FlipNormals()
  {
    // code ....
  }

  [Action("Export .X object", Hotkey = "Ctrl+E")
  public void ExportX()
  {
    // code ....
  }
}

Вопрос в том, как представлять и захватывать горячие клавиши? Как строки? Возможно, есть класс для этого?

void Form_KeyDown(object sender, KeyEventArgs e)
{
  // reflection magic ...

  foreach(var action in actionAttributes)
  {
    string action_hotkey = action.hotkey;

    /**** How to match KeyEventArgs against action_hotkey? ****/
  }
}

Существует ли вспомогательный класс .net для работы с горячими клавишами?

Или я должен развернуть свой собственный класс горячих клавиш?

Какой правильный подход здесь?

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

KeyEventArgs содержит свойство KeyData, которое имеет значение Keys, которое является флагом, что означает, что оно может быть таким:

Keys keys = Keys.Control | Keys.F; (ваша горячая клавиша)

Если вы определяете свои горячие клавиши (атрибут) таким образом (не со строкой), вы можете сравнить ключи вместо строк.

1 голос
/ 03 февраля 2012

В пространстве имен System.Windows.Forms есть перечисление Keys.Тогда для горячей клавиши Ctrl + A вы можете написать что-то вроде этого:

public class Action : Attribute {
  public Keys HotKey {get;set;} 
}


[Action(HotKey = (Keys.Control | Keys.A))]
public void MyMethod() {
  ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...