我正在使用c#windows表单应用程序。我想知道是否有文本框控件的事件处理程序在文本框外单击鼠标时被触发。我尝试了“离开”和“LostFocus”事件处理程序,但只有在点击鼠标时才会触发这些事件处理程序像文本框,按钮或列表框一样控制,但是如果在窗体或选项卡或任何容器上单击鼠标,则不会触发处理程序。(为了使问题更清晰>我希望它像在单击鼠标时隐藏文本框的AutoCompleteListBox的操作在文本框之外)。我希望你理解,我希望有一个直接解决这个问题的方法。感谢
**好吧似乎问题不够明确。我正在制作一个类似AutoCompleteTextBox的控件,但它以AutoCompleteBox的不同方式列出项目。当用户在文本框中写入时,此控件出现。有时用户不想选择任何项目,因此他想要隐藏控件。我希望用户能够隐藏这个控件,不仅可以通过选择其中一个项目或清除文本框,还可以通过克服表单的任何部分来控制控件的类型。“Lost Focus”和“Leave”处理程序当用户单击表单或TabControl或面板时,不要触发操作。希望你理解。
答案 0 :(得分:4)
我可以建议采用不同的方法吗?你想要一个流畅,隐藏的“自动完成”,对吧?想象一下,用户输入了一些部分信息,并希望离开文本框。现在,假设用户不使用鼠标,而只是将文本框中的选项卡标注到另一个文本框中。不应该使文本框自动完成吗?
将行为绑定到文本框外部的单击意味着,出于某种原因,您希望用户不要单击另一个控件,而是单击表单(或文本框的直接容器),这不是标准行为。为什么用户会点击什么?
您最好的方法是使用Leave和LostFocus事件。将两者绑定到相同的自动完成功能。
答案 1 :(得分:3)
只要将文本框作为焦点,就会显示自动完成列表。单击文本框外部确实是让文本框失去焦点的一种方法。但这确实需要您点击想要的内容来获得焦点。表格没有,它没有用,这就是为什么它不起作用。
获取窗口以查看窗口外发生的鼠标事件需要捕获鼠标。 Winforms使用Control.Capture属性支持它。将其设置为true并将所有鼠标消息定向到控件,即使鼠标不再靠近窗口也是如此。您将使用MouseDown事件并在窗口客户区检查鼠标位置,以检测鼠标是否在窗口外单击。
这就是菜单工作的方式。单击菜单外部,它将消失。然而,这对于文本框来说是非常棘手的。只有您自己取消鼠标或单击鼠标按钮才能捕获鼠标。虽然单击鼠标进行菜单只有一个原因,但单击菜单项时,用户有很多理由可以单击鼠标来显示文本框。选择文本,更改插入点,调出上下文菜单。所有将取消捕获的操作,您必须重新捕获。这很难做到。上下文菜单使它特别棘手,因为你只能在它消失后重新捕获。现在你必须编写检测它关闭的代码,而不是在Winforms中直接支持。
这不实用,这就是为什么自动完成列表仅在文本框失去焦点时消失。也许你可以通过限制文本框的工作方式使其工作。例如,禁用上下文菜单。不太确定这是个好主意。
您可以通过在发送之前筛选鼠标消息来使其工作。这是一个非常沉重的方法,但会起作用。您可以通过实现IMessageFilter来获取消息。