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

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

相关代码:
展开:
private void toolStripButton2_MouseHover(object sender, EventArgs e)
{
//鼠标悬停事件,展开
if (!this.panel2.Visible) //panel2为侧边栏的容器
{
Thread ts = new Thread(new ParameterizedThreadStart(TaskShowPanel));
ts.Is 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);
}

时间: 2024-10-27 13:34:18

C#使用Panel实现窗体动态侧边栏的相关文章

winform-请问C#用panel切换窗体是怎样的,急急急,先谢谢各位大侠啦

问题描述 请问C#用panel切换窗体是怎样的,急急急,先谢谢各位大侠啦 我设置了一个菜单和两个panel 1 和2,想分别显示窗体Form2和Form3,代码如下,但是结果没法进行切换,请问应当怎样写代码?新手,谢谢 private void 时间换算ToolStripMenuItem_Click(object sender, EventArgs e) { panel1.Controls.Clear();//移除所有控件 Form2 frm2 = new Form2(); frm2.TopLe

javascript 实现动态侧边栏实例详解_javascript技巧

javascript 实现动态侧边栏 总的来说就是利用 鼠标悬停onmouseover   和  鼠标移除onmouseout 这两个时间来完成的. 首先是HTML 结构 <body> <div id="div1"> <span>侧边栏</span> </div> </body> 然后是css的样式: #div1{ width:150px; height:200px; background:#999999; pos

如何动态的给panel的items动态的添加数据?急急急

问题描述 如何动态的给panel的items动态的添加数据?急急急 var sysPanel = Ext.create('Ext.panel.Panel'{ title:nodeText layout: 'card' //iconCls: ""icon-chart"" tbar:[{ text:'导出' xtype: 'button' handler:function (){ var url = ""sysInfor.do?method=Expo

2010-请教:visual studio 2008 如何实现单文档多窗体动态切换

问题描述 请教:visual studio 2008 如何实现单文档多窗体动态切换 请教下大家, visual studio 2008 或2010如何在单文档中实现多个窗口的动态切换呢?谢谢!visual C++ 6.0在win8 win10上总是崩溃,没招了! 解决方案 http://wenku.baidu.com/link?url=ZwJ3S4kwcGy0OBQZtG8ZFXMB_BuyzuFYJCSXcfhRre6mLYiUxQ3cKIbQux0ZvLgOeqTVquLqcx0xBdH6H

C# panel 嵌入窗体 不停靠 父窗体?

问题描述 C# panel 嵌入窗体 不停靠 父窗体? this.Main_panel.Controls.Add(Forms); 本来应该是填满整个窗体的 正常应该是这样的 解决方案 使用Dock属性布局,一个是DockStyle.Left,一个是DockStyle.Fill 解决方案二: Forms.DockStyple.Fill

如何将一个panel从窗体移出

问题描述 //推出右侧大panelprivatevoidremove_RPanel(){while(this.backPanel.Location.X<backPanel.Width){this.autoPanel.Location=newPoint(autoPanel.Location.X+10,autoPanel.Location.Y);this.picpanel.Location=newPoint(picpanel.Location.X+10,picpanel.Location.Y);Sy

Java窗体动态加载磁盘文件的实现方法_java

在使用图形界面操作系统时,当打开一个文件夹系统会自动列出该文件夹下的所有文件及子文件夹.本实例实现了类似的功能:首先让用户选择一个文件夹,程序会动态列出该文件夹下的所有文件:如果该文件是隐藏文件,就在属性栏中显示"隐藏文件".要用到进度条来表示是否完成. 思路如下: 首先是视图层.JTextField.JButton.JScrollPane.JTable神马的就不用再提了,都是老盆友了,在这里因为要用到进度条,所以会有一个新盆友:JProgressBar控件.控件们自然是要作为成员变量

WinForm的大Panel中均匀动态添加小Panel的问题

问题描述 需求:Panel作为一个大的容器,通过代码动态添加小Panel,如现实中的一个相片框能放x张一寸相片一样,只是这里换成动态的Panel且通过容器计算动态Panel的大小. 解决方案 解决方案二:根据大panel计算小的长宽,边距,放置不就行了解决方案三:比如说尺寸是x,每一个容器占用a,而间距是b,一共放n个容器,那么就是解a*n+(b(n+1)<=x;(n为整数)从中解出n.对于宽和高分别解出n1.n2,就知道横向几列.纵向几列.解决方案四:a*n+b*(n+1)<=x;解决方案五

javascript实现动态侧边栏代码_javascript技巧

总的来说就是利用 鼠标悬停onmouseover   和  鼠标移除onmouseout 这两个时间来完成的. 首先是HTML 结构 复制代码 代码如下: <body><div id="div1"><span>侧边栏</span></div></body> 然后是css的样式: 复制代码 代码如下: #div1{    width:150px;    height:200px;    background:#999