如何在 WinForms 中管理具有不同控件集的多个屏幕?

How do I manage having multiple screens with different sets of controls in WinForms?

我正在使用 WinForms 在 C# 中创建战略井字游戏。我将主游戏屏幕全部包含在 TableLayoutPanel 中,截至目前,当有人获胜时我会关闭该应用程序。

Current state of the board, if helpful

我想在同一表单中创建一个单独的屏幕,向获胜者显示祝贺消息,但我目前的想法(使用 panel 来保持获胜屏幕,并以编程方式切换其可见性)感觉笨重的设计。我应该如何高效、舒适地管理这些多组控件?

有几种方法可以解决这个问题。一种方法是为您的获胜屏幕创建一个新的 UserControl。这使得编辑获胜屏幕变得容易,而不必弄乱您的表单上的东西。

然后在您的表单上,控件将像这样布局。包含 Panel 的 Form1。 Panel 包含一个 WinScreenUserControl 和一个 TableLayoutPanel(用于游戏板)。

您可能想要 win 屏幕和停靠在面板中的 TableLayoutPanel。把 WinScreenUserControl 放到后面,所以它在 TableLayoutPanel 后面。现在,当您想要编辑游戏板时,胜利屏幕将不再存在。如果您想编辑获胜屏幕,只需打开 WinScreenUserControl.

当游戏获胜时,您只需调用 winScreenUserControl1.BringToFront(); 即可将获胜屏幕显示在游戏面板前。

您也可以将游戏面板设为 UserControl 并像获胜屏幕一样进行编辑。

面板可以很好地工作。如果您曾经看过一些视频游戏设计,您通常会看到一个 'SceneManager',它只是您自己创建的用于切换 UI 的对象。它的唯一目的是显示 UI 的正确片段,它可以准确处理您所描述的内容。

我认为你的首要工作是将整个游戏放在一个面板中,如果你还没有的话,应该很容易。

然后您创建自己的 SceneManager class 对象,它只有两个面板属性。然后添加一个方法 'DisplayWinPanel()',它将隐藏主游戏面板的可见性并显示获胜面板。

class SceneManager
{

    public Panel MainGamePanel { private get; set; }
    public Panel WinPanel { private get; set; }

    public SceneManager(Panel MainGamePanel, Panel WinPanel)
    {
        this.MainGamePanel = MainGamePanel;
        this.WinPanel = WinPanel;
    }

    public void ShowWinPanel()
    {
        MainGamePanel.Hide();
        WinPanel.Show();
    }

}

然后在你的表单逻辑中,你将有一个 public 全局变量,它是场景管理器,你将在 form_load() 方法中初始化它,并分配你的里面有两个面板。

    private SceneManager sceneManager;

    ...

    private void Form1_Load(object sender, EventArgs e)
    {
        sceneManager = new SceneManager(panel1, panel2);

        // When win, display win screen
        sceneManager.ShowWinPanel();
    }

然后您可以从逻辑中的任何位置轻松引用场景管理器并隐藏和显示面板。

这样做的意义在于方便您添加更多的管理。例如,假设您决定添加一个 menuPanel,然后您可以在场景管理器中使用逻辑来处理它。您可以继续进行下去,但重点是 SceneManager 可以轻松执行您所描述的操作,否则会变得混乱。

我的建议可能不是最好的,但这是一个好的开始。其他人以不同的方式来做,所以没有真正错误的方式(但有更好的方式)。