您好,登錄后才能下訂單哦!
有時候發現界面的布局比較復雜,需要隱藏顯示一部分內容需要使用動態側邊欄的方法實現,雖然可是使用第三方的控件,但是有時候也不需要那么麻煩,自己做了一個簡單的,可是使用在要求不高的場所。
可以實現側邊欄的展開、隱藏和鎖定的功能。添加的側邊欄默認是不顯示的通過鼠標的懸停事件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);
}
做的還不太成熟,但是基本的功能實現了,本人拋磚引玉一下,希望有大俠有更好的方法。源代碼附上
C#使用pannel實現動態側邊欄
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。