C# 系统应用之使用Pancel控件同一窗体切换页面

本文介绍了如何使用Panel控件在单一窗体中实现页面切换功能,包括解决Panel重叠导致的可见性问题,并提供了通过加载Form实现页面切换的替代方法。文中还分享了在调整Panel层次关系和添加控件时的技巧。

该文章是项目"个人电脑历史记录清除软件"的系列文章.主要讲述如何使用Pancel控件实现类似于360安全卫士的点击图标窗体不变,但页面内容变换的功能及遇到的重叠Panel不能设置Visible(可见)问题.

一.通过文档大纲查看层次关系

在使用panel控件时我遇到的一个问题是:当有多个panel(对控件集合分组)控件重叠显示时,在页面切换如下代码:

private void pictureBox1_Click(object sender, EventArgs e)
{
    panelIE.Visible = true;
    panel2.Visible = false;
}

但运行的结果总是Panel1和Panel2同时隐藏.(感谢:bdmh)
解决方案:其中一个panel的parent可能被设置为另一个panel了,在拖动窗体控件时很容易就拖动至其他空间上.通过打开"视图->其他窗口->文档大纲"查看控件的层次图,就可以发现panelIE确实被自动设置为panel2的parent.
所以可以在"文档大纲"中手动拖动设置其panel关系,但好像只能拖动至顶层.(PS:没有找到好的方法,而且选中某个panel添加控件如button没有其视图可编辑)

二.设置多个panel切换界面

最初的打算是使用6个panel控件实现,点击不同的图标设置其Visible(是否课件)实现同一个窗体切换界面.代码如下:

/// <summary>
/// 点击标题菜单,对panel的显示
/// </summary>
/// <param name="p"></param>
private void PanelIsDisplay(int p)
{
    //设置panel显示界面 (IE\Word\回收站\U盘\电脑\文件粉碎)
    panelIE.Visible = false;
    panelWord.Visible = false;
    panelRecycle.Visible = false;
    panelU.Visible = false;
    panelRecent.Visible = false;
    panelFile.Visible = false;        

    switch (p)
    {
        case 1:  //显示"清除IE"
            {
                panelIE.Visible = true;
            }
            break;
        case 2:  //显示"清除Word"
            {
                panelWord.Visible = true;
            }
            break;
        case 3:  //显示"清空回收站"
            {
                panelRecycle.Visible = true;
                this.panelRecycle.BackColor = Color.Red;
            }
            break;
        case 4:  //显示"清除U盘"
            {
                panelU.Visible = true;
            }
            break;
        case 5:  //显示"电脑清理"
            {
                panelRecent.Visible = true;
            }
            break;
        case 6:  //显示"电脑清理"
            {
                panelFile.Visible = true;
            }
            break;
        default:
            {

            }
            break;
    }
}

//鼠标点击"清除IE"实现切换界面
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    //透明罩设置
    cmd.ShowOpaqueLayer(panel_mol3, 125, true);

    //自定义设置Panel切换函数
    PanelIsDisplay(1);
}

但是后来发现设置多个panel的层次关系和向某个panel中添加控件时非常繁琐,同时有的控件不能很好的设置.所以建议如果是2个panel的切换或者没有重叠的panel设置,可以通过该方法设置其Visible(是否可见)来隐藏与显示.如果重叠的可以参考下面的方法.

三.Panel控件加载Form实现页面切换

可以通过panel控件加载Form来实现该页面切换功能.向解决方案中添加不同页面的Form,设置窗体的控件是非常方便的,再加载到Panel2中显示即可.代码如下:

/// <summary>
/// 向panel2中加载窗体Form,MouseEnter事件调用
/// </summary>
/// <param name="p"></param>
private void Control_Add(Form form)
{
    panel2.Controls.Clear();    //移除所有控件
    form.TopLevel = false;      //设置为非顶级窗体
    form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; //设置窗体为非边框样式
    form.Dock = System.Windows.Forms.DockStyle.Fill;                  //设置样式是否填充整个panel
    panel2.Controls.Add(form);        //添加窗体
    form.Show();                      //窗体运行
} 

//鼠标进入"清空回收站"
private void panel_mol3_MouseEnter(object sender, EventArgs e)
{
    //透明罩设置
    cmd3.ShowOpaqueLayer(panel_mol3, 125, true);
    if (isClick1 == false) cmd1.HideOpaqueLayer();
    if (isClick2 == false) cmd2.HideOpaqueLayer();
    if (isClick4 == false) cmd4.HideOpaqueLayer();
    if (isClick5 == false) cmd5.HideOpaqueLayer();
    if (isClick6 == false) cmd6.HideOpaqueLayer();

    //自定义函数加载窗体 CleanRecycle
    CleanRecycle recycle = new CleanRecycle();
    Control_Add(recycle);
}

运行结果如下图所示:

最后该文章主要是结合自己的实际东西讲解,有些浅显和简单,如果你刚好遇到类似的问题就可能对你使用Panel控件有所帮助.同时如果在文章中遇到错误或不足的地方,请海涵!我也在寻找更好的方法,如果你在同一个窗体下切换界面有什么更好的方法,希望告知.
(By:Eastmount 2014-3-18 下午4点 原创优快云http://blog.youkuaiyun.com/eastmount/)

 

引用\[1\]:SplitContainer控件可以使设计时的控件放置更容易。通过将SplitContainer控件添加到一个Form中,并设置其Dock属性为DockStyle.Fill,可以创建一个与Windows资源管理器类似的窗口。同时,将TreeView控件添加到Form并设置其Dock属性为DockStyle.Fill,然后添加一个ListView控件并将其Dock属性设置为DockStyle.Fill,可以完成布局,使ListView占据Form上的剩余空间。在运行时,用户可以使用拆分器调整两个控件的宽度。使用FixedPanel属性可以指定某个控件不应随Form或其他容器一起调整大小。\[1\] 引用\[2\]:可以通过panel控件加载Form来实现页面切换功能。向解决方案中添加不同页面Form,设置窗体控件非常方便,再加载Panel中显示即可。代码如下: private void Control_Add(Form form) { panel.Controls.Clear(); //移除所有控件 form.TopLevel = false; //设置为非顶级窗体 form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; //设置窗体为非边框样式 form.Dock = System.Windows.Forms.DockStyle.Fill; //设置样式是否填充整个panel panel.Controls.Add(form); //添加窗体 form.Show(); //窗体运行 } 通过调用Control_Add方法,可以向panel加载窗体Form实现页面切换功能。\[2\] 引用\[3\]:Dock和Anchor是用于控制控件窗体或父控件中的位置和大小的属性。Dock表示控件的某个边与窗体重合,控件的变化在设计时就能呈现出来。Dock有Bottom、Fill、Left、None、Right、Top六种DockStyle类型。Anchor表示在窗体重置时控件窗体或父控件的相对位置保持不变,控件的变化要等到窗体重置时才能呈现出来。默认情况下,控件的Anchor属性设置为"Top, Left",即控件窗体的顶边和左边缘固定相关。\[3\] 综上所述,DockStyle是用于控制控件窗体中停靠位置的属性,而Anchor是用于控制控件窗体或父控件的相对位置保持不变的属性。 #### 引用[.reference_title] - *1* [Winform/C#入门编程之第三部分容器(四:缩放控件SplitContainer)](https://blog.youkuaiyun.com/C_gyl/article/details/85237531)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C# 系统应用使用Pancel控件同一窗体切换页面](https://blog.youkuaiyun.com/Eastmount/article/details/21461275)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C#基础学习之——(一)Dock与Anchor](https://blog.youkuaiyun.com/qq_42413826/article/details/115406581)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eastmount

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值