可以实现侧边栏的展开隐藏和锁定的功能添加的侧边栏默认是不显示的通过鼠标的悬停事件MouseHover来触发展开动作侧边栏实际上是一个窗体或者是容器实现展开的动作必须在一个时间段内逐步的增加宽度我采用Panel作为容器的载体在一个线程中逐步增加Panel的Width属性隐藏主要使用的是Panel的Visible属性来实现隐藏条件的判断是通过判断鼠标位置是不是在侧边栏的边界之外来实现的锁定是使Panel始终处于显示的状态使隐藏Panel的函数不执行来实现的
界面
相关代码
展开
private void toolStripButton_MouseHover(object sender EventArgs e)
{
//鼠标悬停事件展开
if (!thispanelVisible) //panel为侧边栏的容器
{
Thread ts = new Thread(new ParameterizedThreadStart(TaskShowPanel));
tsIs true; //设置为后台线程
tsPriority = ThreadPriorityNormal; //设置优先级
tsStart((Object)); //Panel展开宽度
}
}
//定义的线程执行函数
private void TaskShowPanel(Object ParObject)
{
int w = (int)ParObject;
for (int i = ; i <= w; i++)
{
ShowPanel(thispanel i);
}
}
private delegate void SetTextCallback(Panel p int w);
/// <summary>
/// 展开动作
/// </summary>
/// <param name="p">panel容器</param>
/// <param name="w">宽度</param>
private void ShowPanel(Panel pint w)
{
//跨线程访问
try
{
if (pInvokeRequired)
{
SetTextCallback d = new SetTextCallback(ShowPanel);
pInvoke(d new Object[] { p w });
}
else
{
pWidth = w;
if (!pVisible)
{
pVisible = true;
}
}
}
catch (Exception ex)
{
MessageBoxShow(exMessage "ShowPanel函数执行错误");
}
}
隐藏
private void listView_MouseMove(object sender MouseEventArgs e)
{
Point panelPoint = thisPointToClient(ControlMousePosition); //鼠标当前位置
//thispanelLocationX panel的起始位置
//thispanelWidth panel的宽度
if (thispanelVisible && (panelPointX > (thispanelLocationX + thispanelWidth)))
{
thispanelVisible = false;
}
}
锁定
private void button_Click(object sender EventArgs e)
{
//删除隐藏事件
thislistViewMouseMove = new SystemWindowsFormsMouseEventHandler(thislistView_MouseMove);
}