在我的主窗体上,有另一个(可浮动的)窗口。这个浮动窗口的工作原理有点像弹出窗口,因为当用户单击此窗口之外的其他地方时,它将关闭。这是由停用事件处理的。但是我想要做的是,如果用户点击一个不同的控件(比如一个按钮),我想关闭这个浮动窗口,然后只需点击一下就可以激活那个按钮。目前,用户必须单击两次(一次用于停用窗口,另一次用于激活所需的按钮)。有没有办法只需一次点击就能做到这一点?
发布于 2008-12-13 12:36:55
foreach(Control c in parentForm.Controls)
{
c.Click += delegate(object sender, EventArgs e)
{
if(floatyWindow != null && floatyWindow.IsFloating)
{
floatyWindow.Close();
}
};
}
然后像往常一样添加处理程序。这个额外的处理程序可以关闭浮动窗口。确保你的浮动窗口也不是一个对话框,因为这不会允许你的父窗体的控件被点击。
发布于 2008-12-13 12:34:53
我有一个略显老套的解决方案。在停用事件中,向主窗体激发另一个自定义事件。然后,当您的主窗体处理自定义事件时,枚举您的控件(this.Controls),并通过检查它们的所有绑定来定位鼠标下的控件,然后调用Focus()。您可能需要按具有最小表面积的控件进行排序,或者您可以有一个单独的“可聚焦”控件列表,如按钮。
另一种方法可能是在可浮动窗口的OnMouseLeave或主窗口的OnMouseHover之后立即将焦点切换到主窗体,但将可浮动窗口保持在顶部,只是没有焦点。控制主窗体的全局鼠标按下,然后关闭可浮动窗口。
这些只是理论,没有经过验证。
发布于 2008-12-13 13:38:05
我也遇到过这样的问题,当一个客户想要到处都是“浮动”窗口的应用程序时。我使用的方法与本文中描述的方法类似:
http://www.vbaccelerator.com/home/NET/Code/Controls/Popup_Windows/Popup_Windows/article.asp
代码示例可在此处获得:
通过扩展这一点,我们创建了“浮动”窗口,类似于VS在调试代码时遇到运行时错误时所使用的窗口。
至少,阅读代码可能会给你一些洞察力,然而,quarrelsome的响应可能是更简单的解决方案。
https://stackoverflow.com/questions/365657
复制相似问题