在我的主窗体上,还有另一个(可浮动的)窗口。这个可浮动窗口的工作类似于弹出窗口,当用户点击此窗口外的其他位置时它将关闭。这由Deactivate事件处理。但我想要做的是,如果用户点击不同的控件(比如一个按钮),我想要关闭这个浮动窗口,然后只需点击一下就可以激活该按钮。目前,用户必须单击两次(一个用于停用窗口,再一次用于激活所需按钮)。有没有办法只需点击一下就可以做到这一点?
答案 0 :(得分:2)
foreach(Control c in parentForm.Controls)
{
c.Click += delegate(object sender, EventArgs e)
{
if(floatyWindow != null && floatyWindow.IsFloating)
{
floatyWindow.Close();
}
};
}
然后正常添加处理程序。这个额外的处理程序可以关闭浮动窗口。 确保浮动窗口不是对话框,因为这不允许单击父窗体的控件。
答案 1 :(得分:0)
我有一个轻微的hacky解决方案。在Deactivate事件中,将另一个自定义事件触发到主窗体。然后,当您的主窗体处理自定义事件时,通过您的控件(this.Controls)枚举并通过检查所有绑定在鼠标下找到控件然后调用Focus()。您可能需要按表面积最小的那个进行排序,或者您可以为此选择单独的“可聚焦”控件列表,如按钮。
另一种方法可能是在浮动窗口的OnMouseLeave或主窗口的OnMouseHover之后立即将焦点切换到主窗体,但是将可浮动窗口保持在顶部,只是没有焦点。处理主窗体的全局鼠标,然后关闭可浮动窗口。
这些只是理论,未经过测试。
答案 2 :(得分:0)
我曾经遇到过这样的问题,当一个客户希望在那里应用程序的“浮动”窗口时。我使用的方法类似于本文中描述的方法:
http://www.vbaccelerator.com/home/NET/Code/Controls/Popup_Windows/Popup_Windows/article.asp
此处提供的代码示例:
通过扩展这一点,我们创建了“浮动”窗口,类似于VS在调试代码时遇到运行时错误时使用的窗口。
至少阅读代码可能会给你一些见解,但是,争吵的反应可能是更简单的解决方案。