我正在使用 C# 开发一个简单的通用 Windows 应用程序。我有一个RichEditBox,在使用Control+I组合键时发现了一个奇怪的行为,由于某种原因插入了一个Tab(这是预期的吗?)。因为我想要组合键来切换斜体字体样式,所以我认为最好的方法是通过 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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我按下 Control 键时,Else If上的条件并不总是正确的。我想了解为什么以及我能做些什么来解决它。如果我运行代码并按几次控制键,则输出如下:
KeyDown:控制 => 控制已关闭!
KeyDown:控制
KeyDown:控制 => 控制已关闭!
KeyDown:控制
...
提前致谢 :)
我尝试了您的代码并使用调试器输出来查看在这些情况下 Ctrl 的实际状态:
var state = Window.Current.CoreWindow.GetKeyState(VirtualKey.Control);
Debug.WriteLine(state);
Run Code Online (Sandbox Code Playgroud)
我发现你第二次按下这个键时,它的状态不是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
}
Run Code Online (Sandbox Code Playgroud)
或这个:
else if (
( Window.Current.CoreWindow.GetKeyState(VirtualKey.Control) &
Windows.UI.Core.CoreVirtualKeyStates.Down )
== CoreVirtualKeyStates.Down )
{
//rest of the code
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
432 次 |
| 最近记录: |