如何为winrt::Windows::System::VirtualKey枚举外的键设置KeyboardAccelerator?
解决UWP中为=/-键设置KeyboardAccelerator的问题
核心问题原因
winrt::Windows::System::VirtualKey枚举未包含=键(187)和-键(189)的定义,XAML直接输入数字会触发枚举值校验失败,而{x:Bind}的类型转换规则对部分键码存在兼容性问题。
简便实现方法
推荐直接在后台代码中对KeyboardAccelerator的Key属性进行强制类型赋值,绕过XAML的枚举校验限制:
步骤1:XAML中定义带名称的KeyboardAccelerator
<MenuFlyoutItem ...> <MenuFlyoutItem.KeyboardAccelerators> <!-- 为=键定义快捷键 --> <KeyboardAccelerator x:Name="EqualsKeyAccelerator" /> <!-- 为-键定义快捷键 --> <KeyboardAccelerator x:Name="MinusKeyAccelerator" /> </MenuFlyoutItem.KeyboardAccelerators> </MenuFlyoutItem>
步骤2:后台代码赋值(C++/WinRT示例)
// 在页面/控件的构造函数或Loaded事件中执行 EqualsKeyAccelerator().Key(static_cast<winrt::Windows::System::VirtualKey>(187)); MinusKeyAccelerator().Key(static_cast<winrt::Windows::System::VirtualKey>(189));
步骤2:后台代码赋值(C#示例)
// 在页面/控件的构造函数或Loaded事件中执行 EqualsKeyAccelerator.Key = (VirtualKey)187; MinusKeyAccelerator.Key = (VirtualKey)189;
补充说明
- 这种方式完全避开XAML的枚举值验证逻辑,对所有未在
VirtualKey枚举中定义的键码都有效。 - 若需要添加修饰键(如Ctrl、Shift),直接在XAML或后台设置
Modifiers属性即可,例如:
后台对应设置键码即可。<KeyboardAccelerator x:Name="CtrlEqualsAccelerator" Modifiers="Control" />
内容的提问来源于stack exchange,提问作者Michael Chourdakis
相关产品推荐
相关产品推荐

