2016-05-08 13 views
0

Ich habe eine ToolStripMenuItem, die die ShortcutKeys Ctrl + Oemcomma (d. H. Ctrl+,) hat. Ich möchte diese Verknüpfung in der Nähe des Elementnamens anzeigen, damit der Benutzer diese Verknüpfung sehen kann. Unglücklicherweise wird es als Ctrl+Oemcomma und nicht als die verständlichere Ctrl+, angezeigt.So erhalten Sie den lokalisierten Tastaturschlüsselname in VS C#

Es gibt die Eigenschaft ShortcutKeyDisplayString, die die automatisch erstellte Zeichenfolge überschreibt, so dass man sie beheben kann. Aber sobald die Anwendung in einer Sprache ausgeführt wird, die nicht den Steuerschlüssel aufruft (zB in Deutschland heißt sie Strg), sieht dieser ShortcutKeyDisplayString falsch aus, da alle anderen automatisch erstellten Shortcut-Beschreibungen übersetzt werden (dh wenn in einem Englisch OS eine Beschreibung wird angezeigt als Ctrl+S, in einem deutschen Betriebssystem zeigt es dann Strg+S).

Gibt es eine Funktion, die den lokalisierten Namen eines Schlüssels zurückgibt, damit ich den ShortcutKeyDisplayString verwenden konnte? I.e. Ich suche nach einer Funktion, die Ctrl in einem englischen OS und Strg in einem deutschen Betriebssystem usw. zurückgibt. Ich versuchte System.Windows.Forms.Keys.Control.ToString(), aber das gibt natürlich nur Control zurück.

Antwort

1

Definieren Sie eine TypeConverter für Keys Enum-Typ.
Wir erben von KeysConverter als dies ist die zugehörige TypeConverter von Keys und wir müssen nur die Keys.Oemcomma Wert behandeln.

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); 
    } 
} 

Dann in Ihrem Program.cs vor callign Application.Run(...):

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

auf Gabors Basierend Antwort löste ich es wie folgt. Es könnte hacky sein, aber es ist kurz und funktioniert.

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