Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Win窗体中,子窗体始终在父窗体前面_C#_.net_Winforms - Fatal编程技术网

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
更可靠。