c# - 一个表单中的多个页面? C#

标签 c# winforms

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

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

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

(无论按下什么按钮,侧 Pane 和标题都保持不变,但内容会发生变化。)

Form

最佳答案

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

public interface IView
{
    bool CanClose();
}

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

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

然后,切换 View 就很容易了:

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!");
    }
}

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

关于c# - 一个表单中的多个页面? C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22322470/

相关文章:

c# - System.ComponentModel.Win32Exception (0x80004005) : No such interface supported

c# - 使用 rest 客户端应用程序发送 Web 请求,但不使用 c#

c# - 如何在 Microsoft Surface 应用程序中显示 PDF 文档?

c# - 混合模式程序集是针对运行时版本 'v2.0.50727' 构建的,无法在 4.0 运行时加载 - 研究的解决方案不起作用

c# - 将简单注入(inject)器与 SignalR 结合使用

c# - Quartz.net 的 Unity LifeTime 管理器

.net - 如果 MDI 子级之一被最大化,如何防止所有 MDI 子级被最大化

c# - Entity Framework 中的上下文中缺少 AsNoTracking() 方法

c# - 多线程时进度条不显示正确的值

c# - 显示列表中的日期 C#