WPF中的本地化输入手势文本

时间:2018-02-18 22:04:40

标签: c# wpf

我有一个自定义RoutedCommand,其输入键手势在本地化应用程序的菜单项中调用。我发现显示为我自己命令的键盘快捷键的文本未本地化为德语(显示为" Ctrl + ..."),而内置的ApplicationCommands'键修饰符被翻译为德语(显示为" Strg + ...")。

结果如下:

how it looks like

这是xaml代码:

<ContextMenu>
    <MenuItem Header="Edit" Command="local:MyWindow.MyCommand"/>
    <MenuItem Header="Save" Command="Save"/>
</ContextMenu>

这是为什么?如何本地化自己的命令(最好不用硬编码翻译的修饰符)?

1 个答案:

答案 0 :(得分:0)

最后结束这个问题:

看起来,内置命令使用一些内部查找来获取其输入手势的本地化字符串。例如。 ApplicationCommands的方法如下:

https://referencesource.microsoft.com/#PresentationCore/Core/CSharp/System/Windows/Input/Command/ApplicationCommands.cs,343

我发现不需要手动为所有输入手势添加资源的唯一方法是将WPF键转换为WinForms键并在其中创建显示字符串:

static Keys ToWinFormsKeys(Key key, ModifierKeys modifiers)
{
    Keys keys = (Keys)KeyInterop.VirtualKeyFromKey(key);
    if ((modifiers & ModifierKeys.Alt) == ModifierKeys.Alt)
        keys |= Keys.Alt;
    if ((modifiers & ModifierKeys.Control) == ModifierKeys.Control)
        keys |= Keys.Control;
    if ((modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
        keys |= Keys.Shift;
    return keys;
}

static KeyGesture CreateGesture(Key key, ModifierKeys modifiers)
{
    Keys formsKeys = ToWinFormsKeys(key, modifiers);
    string display = wFormsKeyConv.ConvertToString(formsKeys);
    return new KeyGesture(key, modifiers, display);
}

现在,可以将上面的示例更改为所需的行为:

MyCommand.InputGestures.Add(CreateGesture(Key.E, ModifierKeys.Control));