最近在做一個鼠標經過彈出 TreeView 面板功能 , 要求鼠標離開TreeView區域,隱藏面板。 功能如期開發,其中當TreeView 出現滾動條時,鼠標經過TreeView中的滾動條時,提前隱藏。 原因: TreeView 中將 滾動區域視為非已部份。因此鼠標經過該區域,觸發 MouseLeave 事件,但滾動區域沒有顯示聲明 MouseEnter , MouseLeave 的入口 , 因此無法在觸發MouseLeave(隱藏動作) 后即時觸發 滾動區域的MouseEnter(顯示面版)事件。
因此禁用TreeView Scroll 功能,外層使用Panel, Panel 同時禁用Scroll 功能(只做容器), Scroll 功能由 VScrollBar 實現滾動功能,通過設置 TreeView.Top 值。
因此,需要做如下工作:
1. 手動計算TreeView 內容高度,並將高度值賦給 TreeView.Height.
2.將VScrollBar Maxnum 值設為 TreeView.Height - Panel.Height
3. 設置VScrollBar 中的ValueChange 事件,將 value 賦給 TreeView.top
private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
{
//e.NewValue 值達不到 vScrollBar1.Maximum ???
if (vScrollBar1.Maximum - e.NewValue <= 10)
{
treeView1.Top = vScrollBar1.Maximum * -1;
}
else {
treeView1.Top = e.NewValue * -1;
}
}
其中 VScrollBar Value 值最大時,總是小預設的 Maximum值,因此即使滾動到底部,也總有一部份內容不可視。因此,采用折中方式,如果滾動到底部時,VScrollBar Value 值 與 Maximum之差小於 10 px , 將 當前滾動值視為 Maximum 值
private void vScrollBar1_Scroll(object sender, ScrollEventArgs e) { //e.NewValue 值達不到 vScrollBar1.Maximum ??? if (vScrollBar1.Maximum - e.NewValue <= 10) { treeView1.Top = vScrollBar1.Maximum * -1; } else { treeView1.Top = e.NewValue * -1; } }
