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

Egy*_*ast 5 .net c# textbox winforms

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

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

Han*_*ant 3

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

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

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

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

您可以通过在传递鼠标消息之前对其进行筛选来使其发挥作用。这是一种非常严厉的方法,但会起作用。您可以通过实现 IMessageFilter 来获取消息。