天天看點

WinForm 中 VScrollBar Maximum 問題

       最近在做一個滑鼠經過彈出 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