最近在做一個滑鼠經過彈出 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;
}
}
轉載于:https://www.cnblogs.com/a_bu/p/4054895.html