从Form3关闭Form2,已在Form1中打开

时间:2016-05-15 20:33:42

标签: c# winforms

所以,我正在做一个小游戏。 " Game.cs"打开Win-Screen(" winscreen.cs")。 Winscreen让您能够创建新游戏。 Game.cs通过MainMenu打开。

如果您点击Winscreen上的New-Game按钮,它会打开一个新的Playfield:

private void winscreen_again_Click(object sender, EventArgs e)
{
    Game loadGame = new Game();
    loadGame.Show();
}

问题是:它打开了新的Playfield,而曾经通过MainMenu打开的旧Playfield保持打开状态。所以我尝试了loadGame.Close();什么也没做。

我也尝试在我的Form1.cs(The MainMenu)中执行此操作:

public Game loadGame;

稍后再说:

this.loadGame = new Game();   
this.loadGame.StartPosition = FormStartPosition.CenterScreen;
this.loadGame.Show();

要从Winscreen.cs关闭Window,我在Winscreen中做了这个:

Game.loadGame.Close();

因为那没有用,我做了

Game closeGame = new Game();
closeGame.loadGame.Close();

但这也不起作用,如果我将public Game loadGame;设置为"静态" this.loadGame ......不再工作了。

那么如何通过我的Winscreen.cs关闭现有的Game.cs? 谢谢!

1 个答案:

答案 0 :(得分:1)

public partial class Winscreen : Form
{
    // Variable to catch the old playfield
    Game oldPlayfield;

    // the old playfield is passed in the constructor
    public Winscreen(Game opf)
    {
        this.oldPlayfield = opf;
        InitializeComponent();
    }

    private void winscreen_again_Click(object sender, EventArgs e)
    {
        Game loadGame = new Game();
        loadGame.Show();

        // close the old field
        this.oldPlayfield.Close();
    }
// rest of the class
}

在CheckWinner方法内的Game.cs中,您可以像这样调用Winscreen:

//Shows the winner Animation and changes the Text to the Winning player
Winscreen loadWinscreen = new Winscreen(this);

不幸的是我现在无法测试它以验证它是否可行。 这也不是最干净的解决方案。 2.nd选项: 我建议使用布尔属性repeatGame,当用户按下Winscreen.cs按钮时,可以在winscreen_again中设置为true。在Winscreen内创建Game.cs类型的属性,并在Closing的构造函数中订阅Game事件。 在事件处理程序中,您可以询问是否已设置repeatGame标记,如果是,您可以清除游戏区并开始新游戏。