如何在 WPF 中处理 Ctrl+Click 事件 XAML
How to handle Crtl+Click event in WPF XAML
我想在 WPF XAML 代码隐藏中处理 crtl+click 事件。我注册了 KeyDown 事件和 MouseDown 事件,但我无法同时注册它们。我缺少的是什么。
private void Window_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key.Equals(Key.LeftCtrl))
{
//do something
}
}
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount == 1)
{
//do something
}
}
谢谢,
RDV
做这样的事情,用一个标志:
bool _isControlPressed = false;
private void Window_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key.Equals(Key.LeftCtrl))
{
_isControlPressed = true;
}
}
private void Window_KeyUp(object sender, KeyEventArgs e)
{
if (e.Key.Equals(Key.LeftCtrl))
{
_isControlPressed = false;
}
}
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount == 1 && _isControlPressed)
{
//do something
}
}
_isControlPressed
标志在 down/key 关键事件中是 set/unset。然后,您可以在其他方法中使用此标志来确定键状态。
不要费心跟踪键 Up/Down 事件——它们不可靠(例如,用户可能会在按下和释放之间切换 windows)。处理点击时只需勾选 Keyboard.Modifiers
。
如果您 仅 想要处理 Ctrl+Click
而不是 Ctrl+Shift+Click
,则检查 Modifiers
是否完全匹配:
if (e.ClickCount == 1 && Keyboard.Modifiers == ModifierKeys.Control) {
}
否则,进行选择性按位匹配:
if (e.ClickCount == 1 && (Keyboard.Modifiers & ModifierKeys.Control) != 0) {
}
Keyboard.Modifiers
一般应该是一致的:在你处理鼠标事件后才会反映control键的释放,因为所有的输入事件都被处理了按照先进先出的顺序。
一定要仔细阅读冒泡事件与隧道事件(例如,MouseDown
与 PreviewMouseDown
),以及事件如何在标记为 Handled
后停止路由。
作为替代方案,您可以使用简单的 MouseGesture
,MouseAction
为 LeftClick
,Modifiers
为 Control
。这实际上取决于您的 UI 是什么样子,以及您是否希望有机会在任何后代控件之前处理该事件。使用鼠标手势应该在(大部分)与处理冒泡 MouseDown
事件相同的场景中工作。但是如果你需要依赖像 PreviewMouseDown
这样的隧道事件,那么手势就不行了。
我想在 WPF XAML 代码隐藏中处理 crtl+click 事件。我注册了 KeyDown 事件和 MouseDown 事件,但我无法同时注册它们。我缺少的是什么。
private void Window_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key.Equals(Key.LeftCtrl))
{
//do something
}
}
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount == 1)
{
//do something
}
}
谢谢,
RDV
做这样的事情,用一个标志:
bool _isControlPressed = false;
private void Window_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key.Equals(Key.LeftCtrl))
{
_isControlPressed = true;
}
}
private void Window_KeyUp(object sender, KeyEventArgs e)
{
if (e.Key.Equals(Key.LeftCtrl))
{
_isControlPressed = false;
}
}
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount == 1 && _isControlPressed)
{
//do something
}
}
_isControlPressed
标志在 down/key 关键事件中是 set/unset。然后,您可以在其他方法中使用此标志来确定键状态。
不要费心跟踪键 Up/Down 事件——它们不可靠(例如,用户可能会在按下和释放之间切换 windows)。处理点击时只需勾选 Keyboard.Modifiers
。
如果您 仅 想要处理 Ctrl+Click
而不是 Ctrl+Shift+Click
,则检查 Modifiers
是否完全匹配:
if (e.ClickCount == 1 && Keyboard.Modifiers == ModifierKeys.Control) {
}
否则,进行选择性按位匹配:
if (e.ClickCount == 1 && (Keyboard.Modifiers & ModifierKeys.Control) != 0) {
}
Keyboard.Modifiers
一般应该是一致的:在你处理鼠标事件后才会反映control键的释放,因为所有的输入事件都被处理了按照先进先出的顺序。
一定要仔细阅读冒泡事件与隧道事件(例如,MouseDown
与 PreviewMouseDown
),以及事件如何在标记为 Handled
后停止路由。
作为替代方案,您可以使用简单的 MouseGesture
,MouseAction
为 LeftClick
,Modifiers
为 Control
。这实际上取决于您的 UI 是什么样子,以及您是否希望有机会在任何后代控件之前处理该事件。使用鼠标手势应该在(大部分)与处理冒泡 MouseDown
事件相同的场景中工作。但是如果你需要依赖像 PreviewMouseDown
这样的隧道事件,那么手势就不行了。