控件如何处理该控件外的鼠标点击?我正在编写一个自定义控件,我希望当用户单击该控件时该控件从编辑状态切换到正常状态。我正在处理LostFocus事件,当用户标记或单击另一个可聚焦控件时,它会有所帮助。但是,如果他们不单击Focusable,它就不会退出编辑状态。所以我有两个解决方案:示例代码:privatevoidRegisterTopMostParentMouseClickEvent(){_topMostParent=this.FindLastVisualAncestor();如果(_topMostParent==null)返回;_topMostParent.AddHandler(Mouse.MouseDownEvent,newMouseButtonEventHandler(CustomControlMouseDownEvent)MouseDownEvent;}privatevoidUnRegisterTopMostParentMouseClickEvent(){如果(_topMostParent==null)返回;_topMostParent.RemoveHandler(Mouse.MouseDownEvent,newMouseButtonEventPaownEvent);CustomControlMouse}示例代码:AddHandler(Mouse.PreviewMouseDownOutsideCapturedElementEvent,newMouseButtonEventHandler(EditableTextBlockPreviewMouseDownOutsideCapturedElementEvent),true);捕获鼠标。当对象捕获鼠标时,所有与鼠标相关的事件都被认为是具有鼠标捕获的对象执行事件,即使鼠标指针在另一个物体上。只是为了澄清关于鼠标焦点的答案-它有效,但我不得不做一些进一步的挖掘+摆弄以获得实际有效的东西:我正在尝试实现类似组合框的东西并且需要类似的行为-当点击其他东西时下拉列表消失而无法控制知道其他东西是什么。我有一个下拉按钮的以下事件:privatevoidClickButton(objectsender,RoutedEventArgsroutedEventArgs){//dostuff(egactivatedropdown)添加处理器();}CaptureMode.SubTree意味着这意味着你只获取控件外的事件,控件中的任何鼠标活动都会正常传递给事物。您无法在UIElement的CaptureMouse中提供此枚举,这意味着您将调用HandleClickOutsideOfControlINSTEAD来调用控件中的任何子控件或其他处理程序。即使您没有订阅他们正在使用的事件也是如此-完整的鼠标捕获有点太多了!privatevoidAddHandler(){AddHandler(Mouse.PreviewMouseDownOutsideCapturedElementEvent,newMouseButtonEventHandler(HandleClickOutsideOfControl),true);您还需要继续+删除处理程序,但为了清楚/简洁起见,我将其留在此处。最后在处理程序中,您需要再次释放捕获。privatevoidHandleClickOutsideOfControl(objectsender,MouseButtonEventArgse){//做一些事情(例如关闭下拉)ReleaseMouseCapture();我通常获取父窗口并添加预览处理程序,即使它已经被处置。有时,当MouseCapture不够用时,此技术很方便:我会走另一条路-当用户单击表单的另一部分时,这会导致包含控件的表单从控件中移除焦点。在某些情况下,与试图使控件“模拟”失去焦点相比,控件实际上是松散焦点要清楚得多,而实际上它并没有。请记住,除非控件确实失去焦点,否则它仍将接受键盘输入等。以上就是C#学习教程:控件如何处理控件外的鼠标点击?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
