2016-05-08 1 views
0

У меня есть ToolStripMenuItem, у которого есть ShortcutKeys Ctrl + Oemcomma (т. Е. Ctrl+,). Я хочу показать этот ярлык рядом с именем элемента, чтобы пользователь мог видеть этот ярлык. К несчастью, это показано как Ctrl+Oemcomma, а не как более понятное Ctrl+,.Как получить локализованное имя клавиши клавиатуры в VS C#

Существует свойство ShortcutKeyDisplayString, которое переопределяет автоматически создаваемую строку, так что можно ее исправить. Но как только приложение запускается на языке, который не вызывает контрольный ключ Ctrl (например, в германии он называется Strg), что ShortcutKeyDisplayString выглядит неправильно, поскольку все другие автоматические созданные ярлыки-описания переводятся (т.е. если в english OS описание отображается как Ctrl+S, в немецкой ОС оно отображает Strg+S).

Есть функция, которая возвращает локализованное имя ключа, чтобы я мог использовать это для установки ShortcutKeyDisplayString? То есть Я ищу функцию, которая возвращает Ctrl в английской ОС и Strg в немецкой ОС и т. Д. Я пробовал System.Windows.Forms.Keys.Control.ToString(), но это, конечно, просто возвращает Control.

ответ

1

Определить TypeConverter для Keys Перечислите тип.
Мы наследуем от KeysConverter, так как это связано с TypeConverter от Keys, и нам нужно обрабатывать только значение Keys.Oemcomma.

public class ShortcutKeysConverter : KeysConverter 
{ 
    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 
    { 
     if (Type.Equals(destinationType, typeof(string)) && value is Keys) 
     { 
      var key = (Keys)value; 

      if (key.HasFlag(Keys.Oemcomma)) 
      { 
       string defaultDisplayString = 
        base 
         .ConvertTo(context, culture, value, destinationType) 
         .ToString(); 

       return defaultDisplayString.Replace(Keys.Oemcomma.ToString(), ","); 
      } 
     } 

     return base.ConvertTo(context, culture, value, destinationType); 
    } 
} 

Тогда в вашем Program.cs перед тем callign Application.Run(...):

TypeDescriptor 
    .AddAttributes(
     typeof(Keys), 
     new TypeConverterAttribute(typeof(ShortcutKeysConverter)) 
    ); 
0

На основе Gabors ответа я решил его следующим образом. Это может быть хаки, но это коротко и работает.

settingsToolStripMenuItem.ShortcutKeyDisplayString = ((new KeysConverter()).ConvertTo(Keys.Control, typeof(string))).ToString().Replace("None", ",");