C#使用Panel实现窗体动态侧边栏

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

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

界面ui

wps_clip_image-11395

相关代码:this

展开:.net

private void toolStripButton2_MouseHover(object sender, EventArgs e)线程

        {orm

//鼠标悬停事件,展开事件

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

            {get

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实现动态侧边栏

相关文章
相关标签/搜索