【问题标题】:WPF: Keep custom cursor while mouse is downWPF:鼠标按下时保持自定义光标
【发布时间】:2018-01-24 19:18:01
【问题描述】:

我创建了一个自定义光标并通过 Cursor 属性将其应用于我的控件,当鼠标悬停在控件上时它会正确显示,但是一旦我单击,光标就会变回默认值。我想要的是自定义光标在鼠标按下(并可能被移动)时保持不变,并在鼠标出现时恢复正常(在任何可能的控制上)。我意识到我可以通过在鼠标按下时设置 Mouse.OverrideCursor 来做到这一点,但我不确定当鼠标出现时如何设置覆盖光标,因为它可以在屏幕上的任何位置释放。我想要的行为类似于单击单元格并在 Excel 中拖动。有人对我如何实现这种行为有任何建议吗?

编辑:
我尝试遵循此答案中的建议:https://stackoverflow.com/a/2986757/3818295 但是我的 PreviewMouseLeftButtonUp 处理程序永远不会被调用。

【问题讨论】:

  • 我猜你的PreviewMouseLeftButtonUp 处理程序没有被调用,因为鼠标是在与你订阅的控件不同的控件上释放的。捕获鼠标可以避免这个问题。详情见我的回答。

标签: c# wpf cursor


【解决方案1】:

如果您想为整个应用程序全局更改光标,请使用Mouse.SetCursor 方法。光标将保持更改,直到您再次明确更改它。要改回来,请致电Mouse.SetCursor(Cursors.Arrow)不要传入nullCursors.None,因为它们会给你一个特殊的“隐形”光标。

如果您只想在鼠标按下时更改光标,则启动“拖动”操作的控件将需要捕获鼠标,以便即使在光标离开原来的控制。这确保源代码管理最终接收到鼠标向上事件(除非捕获丢失)。要捕获鼠标,请调用c.CaptureMouse()Mouse.Capture(c),其中c 是您的控件。您需要在拖动操作终止时释放捕获,例如通过c.ReleaseCapture()

在拖动过程中临时订阅拖动源的LostMouseCapture 事件是个好主意,如果捕获丢失则取消拖动操作。如果捕获丢失,则不能保证您会收到鼠标向上事件,因此此时您应该放弃。记得在拖拽结束后退订LostMouseCapture

【讨论】:

  • 订阅 LostMouseCapture 让我发现基本控件在之后立即捕获鼠标,因此 PreviewMouseLeftButtonUp 从未触发。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多