一张表格中有多个页面? C#

问题描述 投票:0回答:3

我已经有一段时间没有这样做了,所以不太确定如何做我需要的事情,但我确信它非常简单。

基本上,我有一个带有导航窗格的表单。我想做到这一点,以便当用户单击该窗格上的按钮时,说“主页”,它会更改表单上的内容,但实际上并不会切换到另一个表单,如果你明白我的意思吗?

例如,我希望导航窗格始终保持不变,我只想更改表单的内容。它几乎就像 Visual Studio 的“工具箱”中的“TabControl”工具,尽管我希望它们是显示在侧窗格中的按钮,而不是直接位于内容上方的选项卡。请参阅下图以获得更好的理解。谢谢!

(无论按下哪个按钮,侧窗格和标题都保持不变,但内容会发生变化。)

Form

c# winforms
3个回答
7
投票

我会使用

UserControl
来实现这一点。单击按钮时会显示一个
UserControl
。我将创建一个接口(例如
IView
),该接口将由声明通用功能的每个
UserControl
实现,例如检查是否可以从一个功能切换到另一个功能的方法(例如表单的 OnClosing 事件),例如这个:

public interface IView
{
    bool CanClose();
}

public UserControl View1: IView
{
    public bool CanClose()
    {
       ...
    }
}

public UserControl View2: IView
{
    public bool CanClose()
    {
       ...
    }
}

那么,切换视图就非常简单了:

private bool CanCurrentViewClose()
{
    if (groupBox1.Controls.Count == 0)
        return true;

    IView v = groupBox1.Controls[0] as IView;
    return v.CanClose();
}

private void SwitchView(IView newView)
{
    if (groupBox1.Controls.Count > 0)
    {
        UserControl oldView = groupBox1.Controls[0] as UserControl;
        groupBox1.Controls.Remove(oldView);
        oldView.Dispose();
    }
    groupBox1.Controls.Add(newView);
    newView.Dock = Dock.Fill;
}

在按钮中您可以执行以下操作:

private void btnHome_Click(object sender, EventArgs e)
{
    if (CanCurrentViewClose())
    {
        ViewHome v = new ViewHome();
        // Further initialization of v here

        SwitchView(v);
    }
    else
    {
        MessageBox.Show("Current View can not close!");
    }
}

我已经在很多场合成功地使用过这种方法。


5
投票

最简单的方法是将多个面板放置为内容容器,实现内容管理器,保留对面板的引用并显示/隐藏所需的面板。

简单,但对于较小的应用程序它可以工作


0
投票

您可以简单地使用具有任意多个

TabControl
TabPages
。对于
TabControl
,您可以将
Alignment
属性设置为
Left

© www.soinside.com 2019 - 2024. All rights reserved.