C# 在Win窗体中,子窗体始终在父窗体前面
我有一个简单的多表单应用程序,如下所示:C# 在Win窗体中,子窗体始终在父窗体前面,c#,.net,winforms,C#,.net,Winforms,我有一个简单的多表单应用程序,如下所示: public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Text = "Parent Form"; var childForm = new ChildForm2() { Owner = this }; childForm.Show(); } } public cl
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Text = "Parent Form";
var childForm = new ChildForm2() { Owner = this };
childForm.Show();
}
}
public class ChildForm2 : Form
{
public ChildForm2()
{
this.Text = "Child Form";
}
}
在这种情况下,子窗体始终位于父窗体的前面。单击父窗体时,子窗体将停留在前景中
这可以通过不设置Owner=This
来解决,应用程序将按照我所希望的那样运行,但这带来了一个新问题。我使用System.Diagnostics.Process
类通过另一个C#程序控制该程序。在其中,我调用了Process.CloseMainWindow
,它允许子进程触发Form.OnClose
事件并优雅地关闭。如果我不设置子所有者,父进程将只关闭子窗体而不是整个应用程序。我没有找到其他方法来关闭主窗口
如何解决这个问题?我希望主窗口能够位于前台,同时仍然能够通过
过程关闭整个应用程序。CloseMainWindow
我相信您必须在应用程序中明确地对其进行编码。如果主窗口应该关闭,则必须实现应用程序关闭所有窗口。如果您有非模式窗口(您显然想要),则必须在主窗口关闭时显式关闭这些窗口,以正确关闭应用程序。请注意,如果子窗口是模态的,则通常无法在关闭子窗口之前关闭主窗口-这是预期的UI行为
当然,您可以随时终止(强制终止)应用程序,但这可能会导致数据丢失或产生其他不希望的影响 我相信您必须在应用程序中明确地编写此代码。如果主窗口应该关闭,则必须实现应用程序关闭所有窗口。如果您有非模式窗口(您显然想要),则必须在主窗口关闭时显式关闭这些窗口,以正确关闭应用程序。请注意,如果子窗口是模态的,则通常无法在关闭子窗口之前关闭主窗口-这是预期的UI行为
当然,您可以随时终止(强制终止)应用程序,但这可能会导致数据丢失或产生其他不希望的影响 Process.MainWindowHandle非常麻烦,操作系统无法明确声明“这是我的主窗口”。它使用一种启发式方法,假设创建的第一个窗口是主窗口。是的,在这段代码中是ChildWindow2,它的本机窗口在Form1之前创建。修复起来非常简单,不用显式地分配所有者,而是使用
childForm.Show(this)代码>。将代码移动到Load事件是修复它的另一种方法。。。。或者移动childForm.Show(这个)
到表单1.show()
处理程序。如果您决定使用UI自动化来自动化应用程序,则WindowPattern.WindowOpenedEvent
更可靠。Process.MainWindowHandle非常麻烦,操作系统无法明确声明“这是我的主窗口”。它使用一种启发式方法,假设创建的第一个窗口是主窗口。是的,在这段代码中是ChildWindow2,它的本机窗口在Form1之前创建。修复起来非常简单,不用显式地分配所有者,而是使用childForm.Show(this)代码>。将代码移动到Load事件是修复它的另一种方法。。。。或者移动childForm.Show(这个)
到表单1.show()
处理程序。如果您决定使用UI自动化来自动化应用程序,WindowPattern.WindowOpenedEvent
更可靠。