繁体   English   中英

在c #Windows窗体应用程序中单击鼠标外的文本框时是否会触发事件处理程序?

[英]Is there an event handler that is fired when mouse is clicked outside textbox in c# Windows Form application?

我正在研究c#windows表单应用程序。 我想知道是否有文本框控件的事件处理程序在文本框外单击鼠标时被触发。我尝试了“离开”和“LostFocus”事件处理程序,但只有在点击鼠标时才会触发这些事件处理程序像文本框,按钮或列表框一样控制,但是如果在窗体或制表符或任何容器上单击鼠标,则不会触发处理程序。(为了使问题更清晰>我希望它像在外面单击鼠标时隐藏文本框的AutoCompleteListBox的操作文本框)。 我希望你理解,我希望有一个直接解决这个问题的方法。 谢谢

**好吧,这个问题似乎还不够明确。 我正在制作一个类似AutoCompleteTextBox的控件,但它以AutoCompleteBox的不同方式列出项目。当用户在文本框中写入时,此控件出现。 有时用户不想选择任何项目,因此他想要隐藏控件。 我希望用户能够隐藏这个控件,不仅可以通过选择其中一个项目或清除文本框,还可以通过克服表单的任何部分来控制控件的类型。“Lost Focus”和“Leave”处理程序当用户单击表单或TabControl或面板时,不要触发操作。希望您理解。

我可以建议一种不同的方法吗? 你想要一个流畅,隐藏的“自动完成”,对吧? 想象一下,用户输入了一些部分信息,并希望离开文本框。 现在,假设用户不使用鼠标,而只是将文本框中的选项卡标注到另一个文本框中。 不应该使文本框自动完成吗?

将行为绑定到文本框外部的单击意味着,出于某种原因,您希望用户不要单击另一个控件,而是单击表单(或文本框的直接容器),这不是标准行为。 为什么用户点击什么?

最好的方法是使用Leave和LostFocus事件。 将两者绑定到相同的自动完成功能。

只要文本框为焦点,就会显示自动完成列表。 单击文本框外部确实是让文本框失去焦点的一种方法。 但这确实需要您点击想要获得焦点的内容。 表格没有,它没有用,这就是为什么它不起作用。

获取窗口以查看窗口外发生的鼠标事件需要捕获鼠标。 Winforms使用Control.Capture属性支持它。 将其设置为true并将所有鼠标消息定向到控件,即使鼠标不再靠近窗口也是如此。 您将使用MouseDown事件并检查窗口客户区域的鼠标位置,以检测鼠标是否在窗口外单击。

这就是菜单工作的方式。 单击菜单外部,它将消失。 然而,这对于文本框来说是非常棘手的。 只有您自己取消鼠标或单击鼠标按钮才能捕获鼠标。 虽然单击鼠标进行菜单只有一个原因,但单击菜单项时,用户有很多理由可以单击鼠标来显示文本框。 选择文本,更改插入点,调出上下文菜单。 所有将取消捕获的操作,您必须重新捕获。 这很难做到。 上下文菜单使它特别棘手,因为你只能在它消失后重新捕获。 现在你必须编写检测它关闭的代码,而不是在Winforms中直接支持。

这是不实际的,这就是为什么自动完成列表仅在文本框失去焦点时消失。 也许你可以通过限制文本框的工作方式使其工作。 例如,禁用上下文菜单。 不太确定这是一个好主意。

您可以通过在交付之前筛选鼠标消息来使其工作。 这是一个非常沉重的方法,但会起作用。 您可以通过实现IMessageFilter来获取消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM