2016-08-20 58 views
2
  • 背景:大多數人都知道的SysListView32共同控制,由.NET框架提供等效包裝ListView類。其內部的一點深度表明它提供的用於滾動其內容的滾動條是不是控制自己,但是由SysListView32控制管理。強制顯示ListView中的滾動條?

  • 目標:總是繪製滾動條,即使它沒有ListViewItems顯示,或者只有很少的滾動條不需要滾動條;有點像模仿RichTextBox類,其ScrollBars屬性設置爲ForcedBoth。或者有點像這樣ListBox

    What I want...


  • 的問題(一個或多個)

    1. .NETNO根本不在ListView內的滾動條。
    2. Win32文檔沒有指明何時顯示/隱藏和/或啓用/禁用滾動條。
  • 我的解決方法(一個或多個)

    1. override在派生類的WndProc和處理其WM_HSCROLLWM_VSCROLL消息按照步驟2和3。
    2. 呼叫base.WndProc做實際上需要處理滾動功能。
    3. 創建一個方法,如WmScroll並做我的立即處理它afterbase.WndProc已返回。
    4. 這包括對GetScrollInfo的p/invoke調用。確定是否實際需要滾動條。如果不是,則調用ShowScrollBarEnableScrollBar,並使用所需的值繪製明顯禁用的滾動條。
  • 問題與解決方法

    1. 它幾乎沒有工作。滾動條顯示和禁用,但像Windows經典主題
    2. 它隱藏了每個ListViewGroup的摺疊按鈕,使它們無用!

的描述圖像:

This hides the beautiful collapse buttons (and looks awful)!


期待已久的實際問題

如何強制滾動條永遠是Visible內的ListView不論ListViewItems數目和禁用他們是否是不必要的,同時避免了尺寸的失算(顯示摺疊按鈕的ListViewGroups)和主題惡化?

答案沒有代碼,和答案與C#代碼VB.NETC++/CLR是受歡迎的。如果您使用.NET支持的任何其他語言發佈代碼,請留下指向我可能使用的代碼轉換網站的鏈接,如果代碼看起來,呃,不可理解。

+1

有示出的ListView相關滾動條操縱一堆[在此Q + A](http://stackoverflow.com/q/24716049/1070452),其包括的PInvoke到'ShowScrollBar' – Plutonix

+0

@Plutonix不錯的鏈接,但我不想根據是否出現滾動條來調整列的大小。我不想隱藏滾動條。我只是希望它們在整個ListView的整個生命週期中都存在。 –

+0

鑑於系統似乎不想這樣做,並且列表視圖以標準形式完美工作,我不知道你的動機是什麼。 –

回答

0
  • 信息

    • 首先,我不得不承認這是一個好的答案而不是最好/最有效之一。如果您的答案與我的不同,請發佈。
    • 其次,這個答案欠Plutonixanswer的一些功勞,試驗我瞭解到,默認ListView沒有WS_HSCROLL | WS_VSCROLL標誌在其樣式中設置。
      • 這就是爲什麼我以前的解決方法有主題的問題。
      • 這些經典滾動條是Windows提供給Control s沒有設置這些標誌。
      • 更改CreateParams也不起作用。您必須使用SetWindowLongOnHandleCreated方法中手動設置它。
      • 我發佈的解決方案不使用上述技術。顯然,爲每個窗口消息調用ShowScrollBar將強制設置這些標誌。
  • 解決方案

    • 定義您WndProc類似如下:

       
      protected override void WndPoc(ref Message m) 
      { 
      //custom code before calling base.WndProc 
      base.WndProc(ref m); 
      //custom after base.WndProc returns 
      WmScroll(); //VERY INEFFICIENT, called for each message :(
      } 
      
    • 定義WmScroll()如下:

       
      protected virtual void WmScroll() 
      { 
      NativeMethods.ShowScrollBar(Handle, SB_BOTH, true); 
      	 
      //si.fMask = SIF_PAGE | SIF_RANGE <- initialized in .ctor 
      	 
      NativeMethods.GetScrollInfo(Handle, SB_HORZ, ref si); 
      if(si.nMax < si.nPage) 
      	NativeMethods.EnableScrollBar(Handle, SB_HORZ, ESB_DISABLE_BOTH); 
      else 
      	NativeMethods.EnableScrollBar(Handle, SB_HORZ, ESB_ENABLE_BOTH); 
      NativeMethods.GetScrollInfo(Handle, SB_VERT, ref si); 
      if(si.nMax < si.nPage) 
      	NativeMethods.EnableScrollBar(Handle, SB_VERT, ESB_DISABLE_BOTH); 
      else 
      	NativeMethods.EnableScrollBar(Handle, SB_VERT, ESB_ENABLE_BOTH); 
      } 
      
    • 輸出

現在,看起來像:

What I Have

這些是其他項目加特色的水平滾動和工作ListViewGroup摺疊按鈕:

Long text leftLong text right

  • 缺失是有
    • 如果組崩潰改變有效的文字寬度,否則垂直滾動條隱藏摺疊按鈕需要AutoResizeColumns的呼叫。
+0

因爲我快速複製了帖子中的鏈接文本。 – Plutonix