我正在使用C#开发一个简单的通用Windows应用程序。我有一个 RichEditBox ,当我使用 Control + I 组合键时,我发现了一个奇怪的行为,由于某些原因,它会插入标签(这是预期的吗?)。因为我希望组合键切换Italic字体样式,我认为最好的方法是通过KeyDown事件。 所以,这是我的代码:
private void richbox_KeyDown(object sender, KeyRoutedEventArgs e)
{
System.Diagnostics.Debug.Write("\nKeyDown : " + e.Key.ToString());
if (e.Key == VirtualKey.Tab)
{
richbox.Document.Selection.TypeText("\t");
e.Handled = true;
}
else if (Window.Current.CoreWindow.GetKeyState(VirtualKey.Control) == Windows.UI.Core.CoreVirtualKeyStates.Down)
{
//If Control is pressed down, check if current key is B,I,U...
System.Diagnostics.Debug.Write(" => Control is down!");
switch (e.OriginalKey)
{
case VirtualKey.B:
toogleBold();
e.Handled = true;
break;
case VirtualKey.I:
e.Handled = true;
toogleItalic();
break;
case VirtualKey.U:
toogleUnderline();
e.Handled = true;
break;
}
}
}
我的问题是,当我按下Control键时, Else If 的条件并不总是如此。我想了解为什么以及我可以做些什么来解决它。 如果我运行代码并按下控制键几次,这就是输出:
KeyDown:Control =>控制力下降了!
KeyDown:Control
KeyDown:Control =>控制力下降了!
KeyDown:Control
...
提前致谢:)
答案 0 :(得分:2)
我尝试了你的代码并使用调试器输出来查看在这些情况下Ctrl的实际状态:
var state = Window.Current.CoreWindow.GetKeyState(VirtualKey.Control);
Debug.WriteLine(state);
我发现第二次按键时,其状态不是 Down ,而是 Down | Locked ,更具体地说是Windows.UI.Core.CoreVirtualKeyStates.Down | Windows.UI.Core.CoreVirtualKeyStates.Locked
。事实证明CoreVirtualKeyStates
是一个标志枚举,它可以同时具有多个值。在这种情况下,您要与==
进行比较,这意味着您没有得到匹配。您可以先使用HasFlag
方法或按位AND(&
)来获取正确的值,然后进行比较,您就可以开始使用了!
这意味着:
else if ( Window.Current.CoreWindow.GetKeyState(VirtualKey.Control).
HasFlag( CoreVirtualKeyStates.Down ) )
{
//rest of the code
}
或者这个:
else if (
( Window.Current.CoreWindow.GetKeyState(VirtualKey.Control) &
Windows.UI.Core.CoreVirtualKeyStates.Down )
== CoreVirtualKeyStates.Down )
{
//rest of the code
}