【发布时间】:2010-12-01 20:03:07
【问题描述】:
我正在尝试在我的项目中实现代码完成弹出窗口。窗口是从窗体派生的。它包含两个控件:从 UserControl 派生的自定义列表(通过图标显示完成的可能性)和一个 VScrollBar。
当弹出窗口出现时,它不会从编辑器中窃取焦点(表单的 ShowWithoutActivation 被覆盖以返回 true)并且编辑器向弹出窗口发送某些击键,以便用户可以使用键盘与其交互。到目前为止,它就像一个魅力。
问题是,我想让用户也可以使用鼠标。但是,当用户点击弹出窗口时,它的表单会激活并从编辑器中窃取焦点。我可以通过将焦点返回给编辑器来对此做出反应,我什至设置了一个计时器来定期执行此操作,但除了是一个糟糕的解决方案之外,编辑器的标题栏在发生这种情况时总是闪烁(当弹出窗口是点击)。
有什么方法可以与不会激活表单的弹出表单(使用鼠标)进行交互?
ShowWithoutActivation 的文档是这样写的:“如果你的非激活窗口需要使用 UI 控件,你应该考虑使用 ToolStrip 控件,比如 ToolStripDropDown。这些控件是无窗口的,当它们被选中时不会导致窗口激活。”这似乎正是我需要的东西,但我想使用自定义控件和滚动条。
同样的问题是显示这两个箭头来切换方法重载的工具提示(从 VS 已知) - 整个表单根本不使用任何控件(仅呈现文本和箭头),但是当单击时,它不应该激活。问题可以总结为“如何创建一个永远不会激活的表单,但允许用户与里面的某些控件进行交互?”。
谢谢。
【问题讨论】:
-
您需要将其设为单独的表单吗?如果您将其实现为浮动在表单上所有其他控件之上的 UserControl,您将不会遇到此问题。当然,您可能希望此弹出窗口能够出现在表单边缘之外。
-
@MusiGenesis:是的,我将弹出窗口设置为单独的表单的主要原因是它可以出现在边缘。闪烁只是一个“美容”问题,但话说回来,它不会发生在VS和类似的应用程序中,所以必须有办法......
-
我有点困惑。您希望用户在浮动窗口上与鼠标进行交互但不想给它焦点?我建议不要使用表单,而只编写一个仍绑定到其父级的浮动控件。
标签: c# .net winforms focus activation