【发布时间】:2020-05-14 17:30:51
【问题描述】:
在我的应用程序中,我有一个应该覆盖整个屏幕的加载屏幕(省略了徽标): Expected
我的视图由 Grid 中的 StackPanel(用于徽标和一些文本)组成。它使用 System.Windows 库中的 Window.Show() 显示。
var popup = new Window()
{
WindowState = WindowState.Maximized,
WindowStyle = WindowStyle.None,
AllowsTransparency = true,
Visibility = Visibility.Visible,
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center,
Content = loaderMvvmSet.View,
IsHitTestVisible = true,
Background = new SolidColorBrush(Colors.White) { Opacity = 0.1 },
Topmost = true,
ShowInTaskbar = false
};
在测试时,我们注意到用户可以使用组合键绕过加载屏幕:Window + Arrow。为了禁用这种调整大小,我设置了ResizeMode = ResizeMode.NoResize。这似乎对单击 Windows + Up / Right / Left 有效。然而,当我点击Windows + Down 我得到这个:Actual
我查看了其他帖子,但未能找到解决问题的方法。这是我尝试过的:
1.将事件处理程序附加到 KeyDown 事件:
一个。将每个键的 Handled 属性分别设置为 true:
private void OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.LWin)
{
e.Handled = true;
}
if (e.Key == Key.Down)
{
e.Handled = true;
}
}
b.检查是否按下了两个键并将 Handled 属性设置为 true:
private void OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.LWin && Keyboard.IsKeyDown(Key.Down))
{
e.Handled = true;
}
}
c。为这两个键创建单独的布尔值,然后如果两者都设置为 true,则忽略该事件。
2。将 KeyBindings 添加到 Window 并给它一个空命令:
一个。使用修饰符和键:
InputBindings = { new KeyBinding() { Modifiers = ModifierKeys.Windows, Key = Key.Down, Command = EmptyCommand } }
b.仅使用 Down 密钥:
InputBindings = { new KeyBinding() { Key = Key.Down, Command = EmptyCommand } }
我注意到第 1 点是针对 Windows 键而不是 Down 键触发 KeyDown 事件。似乎只要我仍然持有 Windows 键,Down 键就不会被确认。
对于第 2 点,同时拥有修饰符和键(a 点)似乎根本不起作用;我在EmptyCommand 中的断点永远不会被命中。而且,只有 Down 键(b 点)似乎与第 1 点中的问题相同,它会为仅使用 LWin 键的 KeyBinding 触发,但不会为 Down 键得到确认(因为我们仍然持有LWin)。
以下是我检查过的一些链接:
【问题讨论】:
-
欢迎您!这是一个深思熟虑的问题,包含您尝试过的技术使其他贡献者更容易提供帮助。
标签: c# wpf keyboard-events