zoukankan      html  css  js  c++  java
  • C#使用Panel实现窗体动态侧边栏

    有时候发现界面的布局比较复杂,需要隐藏显示一部分内容需要使用动态侧边栏的方法实现,虽然可是使用第三方的控件,但是有时候也不需要那么麻烦,自己做了一个简单的,可是使用在要求不高的场所。

    可以实现侧边栏的展开、隐藏和锁定的功能。添加的侧边栏默认是不显示的通过鼠标的悬停事件MouseHover来触发展开动作。侧边栏实际上是一个窗体或者是容器,实现展开的动作必须在一个时间段内逐步的增加宽度,我采用Panel作为容器的载体,在一个线程中逐步增加Panel的Width属性。隐藏,主要使用的是Panel的Visible属性来实现,隐藏条件的判断是通过判断鼠标位置是不是在侧边栏的边界之外来实现的。锁定,是使Panel始终处于显示的状态,使隐藏Panel的函数不执行来实现的。

    界面

    wps_clip_image-11395

    相关代码:

    展开:

    private void toolStripButton2_MouseHover(object sender, EventArgs e)

            {

    //鼠标悬停事件,展开

    if (!this.panel2.Visible)  //panel2为侧边栏的容器

                {

    Thread ts = new Thread(new ParameterizedThreadStart(TaskShowPanel));

                    ts.IsBackground = true;  //设置为后台线程

                    ts.Priority = ThreadPriority.Normal;  //设置优先级

                    ts.Start((Object)245);   //Panel展开宽度245

                }

            }

    //定义的线程执行函数

    private void TaskShowPanel(Object ParObject)

            {

    int w = (int)ParObject;

    for (int i = 0; i <= w; i++)

                {               

                    ShowPanel(this.panel2, i);

                }

            }

    private delegate void SetTextCallback(Panel p1, int w);

    /// <summary>

    /// 展开动作

    /// </summary>

    /// <param name="p1">panel容器</param>

    /// <param name="w">宽度</param>

    private void ShowPanel(Panel p1,int w)

            {

    //跨线程访问

    try

                {

    if (p1.InvokeRequired)

                    {

    SetTextCallback d = new SetTextCallback(ShowPanel);

                        p1.Invoke(d, new Object[] { p1, w });

                    }

    else

                    {

                        p1.Width = w;

    if (!p1.Visible)

                        {

                            p1.Visible = true;

                        }

                    }

                }

    catch (Exception ex)

                {

    MessageBox.Show(ex.Message, "ShowPanel函数执行错误");

                }

            }

    隐藏:

    private void listView1_MouseMove(object sender, MouseEventArgs e)

            {

    Point panelPoint = this.PointToClient(Control.MousePosition);  //鼠标当前位置

    //this.panel2.Location.X panel2的起始位置

    //this.panel2.Width panel2的宽度

    if (this.panel2.Visible && (panelPoint.X > (this.panel2.Location.X + this.panel2.Width)))

                {

    this.panel2.Visible = false;

                }

            }

    锁定:

    private void button1_Click(object sender, EventArgs e)

            {

    //删除隐藏事件

    this.listView1.MouseMove -= new System.Windows.Forms.MouseEventHandler(this.listView1_MouseMove);

            }

    做的还不太成熟,但是基本的功能实现了,本人抛砖引玉一下,希望有大侠有更好的方法。源代码附上

    C#使用pannel实现动态侧边栏

  • 相关阅读:
    第4天--linux内核学习
    make menuconfig出错,需要安装libncurses5-dev找不到文件的终极解决办法(不必更换源,适用于ubuntu 32位平台)
    uboot学习第一天
    与或左移右移操作在ARM寄存器配置中的作用
    第四天网络编程笔记
    socket编程热身程序
    线程的创建pthread_create.c
    json.dumps与json.dump的区别 json.loads与json.load的区别
    解决在Vim中鼠标右键不能粘贴
    Python with语句
  • 原文地址:https://www.cnblogs.com/wangluojisuan/p/2953588.html
Copyright © 2011-2022 走看看