C# 如何加载一个窗口,每次加载两次?

C# 如何加载一个窗口,每次加载两次?,c#,wpf,C#,Wpf,有一段时间本一直在寻找这个问题的解决方案,但我似乎找不到答案 我有一个主窗口,我想从那里加载一个按钮“游戏窗口”2次。我希望在第一次关闭后加载第二个窗口 如果你能想象这个想法: private void Action_Click(object sender, RoutedEventArgs e) { if (blueTeamMap != null && redTeamMap != null) { GameWindow matchBlueTeam =

有一段时间本一直在寻找这个问题的解决方案,但我似乎找不到答案

我有一个主窗口,我想从那里加载一个按钮“游戏窗口”2次。我希望在第一次关闭后加载第二个窗口

如果你能想象这个想法:

private void Action_Click(object sender, RoutedEventArgs e)
{
    if (blueTeamMap != null && redTeamMap != null)
    {
        GameWindow matchBlueTeam = new GameWindow(playersBlueTeam, playersRedTeam, blueTeamMap);
        matchBlueTeam.Show();
        while (matchBlueTeam != null)
        {
            // wait for window to resign
        }

        GameWindow matchRedTeam = new GameWindow(playersBlueTeam, playersRedTeam, redTeamMap);
        matchRedTeam.Show();
    }
}

假设
matchBlueTeam
窗口关闭,并且
GameWindow
有一个
Closed
事件,类似于:

private void Action_Click(object sender, RoutedEventArgs e)
{
    if (blueTeamMap != null && redTeamMap != null)
    {
        GameWindow matchBlueTeam = new GameWindow(playersBlueTeam, playersRedTeam, blueTeamMap);
        matchBlueTeam.Closed += (s,e) => { 
            GameWindow matchRedTeam = new GameWindow(playersBlueTeam, playersRedTeam, redTeamMap);
            matchRedTeam.Show();
        };
        matchBlueTeam.Show();

    }
}

执行以下操作:将代码编辑为如下所示

//your code here.

//add event here
matchBlueTeam.FormClosed += FormName_FormClosed;
matchBlueTeam.Show();
添加事件处理程序:

private void FormName_FormClosed(object sender, System.Windows.Forms.FormClosedEventArgs e)
{
   //unregister first window from event
   ((GameWindow)sender).FormClosed -= FormName_FormClosed;

   if (blueTeamMap != null && redTeamMap != null)
   {
      //pop second window
      GameWindow matchRedTeam = new GameWindow(playersBlueTeam, playersRedTeam,     redTeamMap);
      matchRedTeam.Show();
   }
}

您只需在window方法上请求ShowDialog()。然后等待窗口关闭

Window1 w1 = new Window1();
w1.ShowDialog();
Window2 w2 = new Window2();
w2.ShowDialog();
或与事件相关:

        //////Code    
        Window1 w1 = new Window1();
        w1.Closed += v_Closed;
        w1.Show();
    }


    void v_Closed(object sender, EventArgs e)
    {
        Window1 w1 = (Window1)sender;
        w1.Closed -= v_Closed;
        Window2 w2 = new Window2();
        w2.Show();
    }

使用事件:例如,第一个窗口的
关闭的
事件处理程序来打开第二个窗口。但是,它是否会继续打开第三个窗口呢?或者我遗漏了什么?不,只有当你要求第二个窗口在它的
Closed
事件中打开第三个窗口时。我不确定我是否理解:“matchBlueTeam.Closed+=(s,e)=>{}”语法。但我明白了。如何使其编译?这是一个创建匿名方法的lambda表达式。应该在c#3.5(或4.0,不确定)上编译。您可以了解更多关于lambda表达式和匿名方法的信息。我会先绑定事件处理程序,然后调用Show(100%确保没有任何东西会妨碍处理程序绑定)@Alex,没错。我将据此进行编辑。为了可读性,这样做会阻止程序的其余部分响应其他事件。你假设这是仅有的两扇窗户,没有其他的事情发生。我个人不喜欢这种行为。他没有说在窗户里会发生什么,所以这是最简单的方法。是的,这就是为什么我没有否决这个答案(因为它是正确的)。只是说我个人不喜欢这种行为,只是更喜欢让UI线程在应用程序的其余部分上运行。是的,但如果你喜欢用户输入,这是最好的方式。除非你打算再次使用matchBlueTeam(并且不想重复这种行为,这是不可能的),否则没有必要注销事件。@Jcl:是的,当然,你说得对,因为没有必要注销该事件。我认为最好的做法是在不需要避免内存泄漏的情况下总是从事件中注销,但在这种情况下是不需要的。