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;
            }
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM