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

C# 如何在WinForms中管理具有不同控件集的多个屏幕?,c#,winforms,controls,C#,Winforms,Controls,我正在用WinForms创建一个C#中的战略性井字游戏。我的主游戏屏幕都包含在一个桌面布局面板中,从现在起,当有人赢了,我的应用程序就会关闭 我想在同一个表单中创建一个单独的屏幕,向获奖者显示祝贺信息,但我目前的想法(使用面板来固定获奖屏幕,并通过编程方式切换其可见性)让我觉得设计起来很笨拙。我应该如何高效、舒适地管理这些多组控件?有几种方法可以解决这个问题。一种方法是为win屏幕创建一个新的UserControl。这使得编辑win屏幕变得很容易,而不必处理表单上的内容 然后在表单上,控件的布

我正在用WinForms创建一个C#中的战略性井字游戏。我的主游戏屏幕都包含在一个
桌面布局面板中
,从现在起,当有人赢了,我的应用程序就会关闭


我想在同一个表单中创建一个单独的屏幕,向获奖者显示祝贺信息,但我目前的想法(使用
面板
来固定获奖屏幕,并通过编程方式切换其可见性)让我觉得设计起来很笨拙。我应该如何高效、舒适地管理这些多组控件?

有几种方法可以解决这个问题。一种方法是为win屏幕创建一个新的
UserControl
。这使得编辑win屏幕变得很容易,而不必处理表单上的内容

然后在表单上,控件的布局如下所示。包含
面板的表单1
。包含
WinScreenUserControl
TableLayoutPanel
面板
(用于游戏板)

您可能希望win屏幕和
TableLayoutPanel
停靠在面板中。将
WinScreenUserControl
发送到后面,使其位于
表格布局面板的后面。现在,当您想要编辑游戏板时,win屏幕将不再显示。如果您想编辑win屏幕,只需打开
WinScreenUserControl

赢得游戏后,只需调用
winScreenUserControl1.BringToFront()
将赢牌屏幕显示在游戏板前面


您还可以将游戏板设置为
用户控件
,并像win屏幕一样对其进行编辑。

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

我认为你的第一项工作是把你的整个游戏放到一个面板上,如果你还没有,应该很容易

然后创建自己的SceneManager类对象,该类对象将只有两个属性,即面板。然后添加一个方法“DisplayWinPanel()”,该方法将隐藏主游戏面板的可见性并显示win面板

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();
    }

}
然后在表单逻辑中,有一个公共全局变量,它是场景管理器,在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();
    }
然后,您可以从逻辑和隐藏及显示面板中的任何位置轻松引用场景管理器

这一点是,它使您可以轻松地添加更多的管理。例如,假设您决定添加一个菜单面板,那么您可以在场景管理器中使用逻辑来处理它。你可以让这一点越来越深入,但关键是SceneManager使你描述的事情变得容易,否则就会变得混乱


我的建议可能不是最好的,但这是一个好的开始。其他人会用不同的方式进行操作,这样就不会有错误的方式(但也有更好的方式)。

您可以添加一个新的表单来显示win屏幕。然后在他们获胜后显示此表单。这将创建一个新窗口,对吗?如果可能的话,我更愿意把所有东西都放在一个窗口内。你熟悉哪种UI开发?例如,如果您习惯于HTML,那么可以将面板视为div元素,就像在web开发中一样,显示和隐藏div非常常见。我很好奇为什么显示和隐藏面板让你觉得很笨拙。我对UI开发还不熟悉。我所说的“笨重”是指在VisualStudio的设计模式下很难使用。在提供的屏幕截图中,9个空白方块分别位于一个面板内,该面板还包含一个TableLayoutPanel。TableLayoutPanel被正方形覆盖,因此很难返回和更改。我做错了吗?