此问题是由 vmware fusion 中的设置不一致引起的 - MacOS 的辅助鼠标功能(即右键单击)是由控制左键单击触发的,尽管在 vmware fusion 设置中配置为将控制权作为单独的键发送。
我把它留在这里,因为它概述了为隔离问题而采取的诊断步骤。
此行为可能存在于 MacOS 上的其他虚拟化解决方案中。
这不是重复的 - 我已经尝试了建议的方法 - 它们不起作用。请提供真正的帮助。
我正在尝试在 WPF 画布中实现多选功能,并且需要能够在单击项目时检测何时按住任一控制键。
我已经尝试使用记录在案和接受的方法来获取密钥(Keyboard.IsKeyDown
和Keyboard.Modifiers
),尽管它们应该有效,但在这种情况下它们不起作用。
我无法在应用程序的主窗口中放置密钥处理程序,因为此解决方案是在组件中实现的,因此,我无法访问主窗口。
我无法创建键盘OnKeyDown
覆盖,因为它不会注册事件。我不知道为什么会这样,但可以说,在对 Stack Overflow 进行广泛搜索后,我已经尝试了我能找到的所有方法,目前没有想法。
在当前逻辑中,单击画布中的项目将清除所有选定的项目。如果按住控制键,我不会清除所选项目。
我的应用程序结构如下:
主窗口 -> 停靠面板 -> 滚动查看器 -> 主自定义组件(扩展Canvas
) -> ChildCanvas 对象(多个实例,所有实例也扩展Canvas
)。
该组件不会有任何对主窗口的引用 - 这绝对是不可协商的。
组件不得要求将主窗口的引用传递给它。
组件不能依赖于放置在MainWindow
中的任何逻辑、属性、方法或其他功能代码 - 它必须是完全可重用的。
自定义对象 (ChildCanvas) 的多个实例(ChildCanvas)本身派生自Canvas
,放置在一个基本自定义对象 (ExtendedCanvas) 上,该对象也扩展Canvas
。
我在自定义项中的鼠标事件处理程序中检测到鼠标单击。
虽然理论上我可以处理密钥事件并在密钥下降时设置布尔标志,并在键上升时清除它,但这不是一种可靠的方法,因为它需要将焦点放在处理密钥的任何组件上。
我看过的所有示例都需要一个特定的按键事件处理程序,但我不能在这种情况下应用这种方法,因为它似乎根本没有注册按键,即使实现事件处理程序的组件当时具有焦点。
我想找到一种方法来检查是否在鼠标单击处理程序中按住了某个键,如果在 WPF 中可以的话。
编辑:我尝试使用Keyboard.Modifiers
方法,但这没有返回任何结果。
编辑:我也尝试了Keyboard.IsKeyDown(Key.LeftCtrl)
,它不返回任何值。
编辑:我试图通过在事件管理器上注册来全局处理关键事件,如图所示。我发现,键向上和向下键事件是快速连续触发的。第一个事件的属性e.IsRepeat
为 false,所有后续事件e.IsRepeat
设置为 true。使用这些事件,我设置了一个布尔值,该布尔值设置为在第一个 keyDown 事件中设置为true
e.IsRepeat
为 false(第一次初始按键),如果 keyUp 事件设置为 false,则设置为e.IsRepeat
false
(当物理释放键时,keyUp 事件会触发)。
这不起作用 - 按住键时单击画布上的项目会更改布尔值的状态,将其设置为 false。
此行为与Microsoft文档的键盘处理方式完全不一致。
EventManager.RegisterClassHandler(typeof(Control),
Keyboard.KeyDownEvent,new KeyEventHandler(keyDown),true);
我可以调用Keyboard.IsKeyToggled(Key.LeftCtrl)
它确实显示切换状态,但它会随着每次按键而变化,并且不会显示鼠标单击时是否按住了该键。
public class ExtendedCanvas:Canvas {
public ExtendedCanvas() {
MouseUp += thisMouseUp;
}
void thisMouseUp(object sender,MouseButtonEventArgs e) {
if ((Keyboard.Modifiers & ModifierKeys.Control) > 0) {
//This does not work - no key is registered, as for some reason, Keyboard.Modifiers does not register that the key is held.
}
//If CONTROL is held down
if (!ControlKeyHeldDown) {
ClearSelectedItems();
}
IsSelected = true;
}
}
不一致的行为是 VMWare 选项的结果。
此虚拟机在 MacOS 上运行,尽管 VMWare Fusion 配置为直接发送控制键,但控制单击仍会触发辅助鼠标按钮(即在本例中为右键单击)。
解决方案是:
1) 关闭虚拟机。
2) 在 VMWare Fusion 首选项 -> 键盘和鼠标 ->鼠标快捷键中,启用(选中)"辅助按钮"选项(如果未选中)。
3) 关闭首选项窗口以保存设置。
4) 关闭 VMWare Fusion
5) 重新启动主机系统
6) 在 VMWare Fusion 首选项 -> 键盘和鼠标 -> 鼠标快捷键中,禁用(取消选中)"辅助按钮"选项。
7) 启动 VM,并确认"控制单击"不再触发辅助单击。
此选项已配置为在将 VMWare Fusion 从 8 升级到 10 之前直接发送控制。
似乎尽管未选中"辅助功能"复选框,但该属性已设置为 true,并且它的行为与设置建议的方式不一致。