3

我想为“de-DE”生成一个本地化的键盘快捷键,而不是手动编写它(“Strg+Einfg”)。

var kg = new KeyGesture( Key.Insert, ModifierKeys.Control, "Strg+Einfg" );

在创建 KeyGesture 时是否有一种生成“Strg+Einfg”的好方法?

我必须使用类似的东西吗

var dummy = new KeyGesture( Key.Insert, ModifierKeys.Control );   
var kg    = new KeyGesture( Key.Insert, ModifierKeys.Control, dummy.GetDisplayStringForCulture( ... ) );

? (?) (??)

4

2 回答 2

1

我自己也遇到了同样的问题,并检查了 WPF 源代码。可悲的是,像“Ctrl”这样的字符串实际上是硬编码的。

所以我的想法是简单地使用 WindowsForms 类来显示快捷方式字符串。您可以使用以下代码执行此操作(您可以将其用于派生的 RoutedCommand 类,该类会自动将所有快捷键替换为新的显示字符串):

private void LocalizeShortcuts()
{
    foreach (KeyGesture keyGuesture in this.InputGestures.OfType<KeyGesture>().ToArray())
    {
        this.InputGestures.Remove(keyGuesture);

        System.Windows.Forms.Keys formsKey = (Keys)KeyInterop.VirtualKeyFromKey(keyGuesture.Key);
        if ((keyGuesture.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt)
        {
            formsKey |= Keys.Alt;
        }

        if ((keyGuesture.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
        {
            formsKey |= Keys.Control;
        }

        if ((keyGuesture.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
        {
            formsKey |= Keys.Shift;
        }

        string keyDisplayString = TypeDescriptor.GetConverter(typeof(Keys)).ConvertToString(formsKey);
        this.InputGestures.Add(new KeyGesture(keyGuesture.Key, keyGuesture.Modifiers, keyDisplayString));
    }
}
于 2013-11-13T07:31:06.280 回答
0

我认为答案是您可以放心地忽略该参数。

文档并不完全清楚,但我认为这是正在发生的事情:

  1. 仅当您需要更改默认行为时才设置 DisplayString。我会把它命名为“DisplayStringOverride”。
  2. 每当您生成 MenuItem 时,WPF 都会调用 KeyGesture.GetDisplayStringForCulture。
  3. 如果您需要在其他地方访问显示字符串(例如在按钮工具提示中),您还应该使用 KeyGesture.GetDisplayStringForCulture。

在我的代码中,#3 是我搞砸的地方。我正在阅读 KeyGesture.DisplayString,这让我相信我需要在构造函数中设置它。但是,我发现当我开始使用此扩展方法时可以省略该参数:

using System.Globalization;
using System.Windows.Input;
 ...
public static string GetDisplayString(this KeyGesture keyGesture)
{
    return keyGesture.GetDisplayStringForCulture(CultureInfo.CurrentCulture);
}
于 2015-11-02T20:21:01.527 回答