2015-10-04 145 views
1

我有Listbox的項目的初始數量,它有垂直滾動條。C#Winforms:如何更新ListBox的滾動條,同時用鼠標拖動滾動條

我已經實現了以下行爲:如果我移動(按住鼠標左鍵)滾動到滾動條的結尾,則將一些新項目添加到列表框控件中。問題是隻有當我按下鼠標鍵時,Listbox的滾動條纔會更新(相對於新的列表框項目數)。但是我需要在新項目添加到列表框後立即更新它,而不需要停止拖動鼠標。

我想要的正確行爲舉例:https://www.google.com/fonts。 正如你所看到的那樣,如果你拖動向下滾動,它立即更新並在每次加載新項目時向上跳轉多個位置。

所以,我的問題是:如何正確實現這樣的行爲,而不使用第三方列表框控件?

編輯:

在我的Form1窗體控件我做負載測試通過滾動位置的新項目:

public Form1() 
    { 
     InitializeComponent(); 
     ... 
     var timer = new System.Windows.Forms.Timer(); 
     timer.Interval = 500; 
     timer.Tick += TimerCheckForListItemsScrollDown; 
     timer.Start(); 
    } 

    private void TimerCheckForListItemsScrollDown(object sender, EventArgs e) 
    { 
     if (listBox1.Items.Count < 1) 
     { 
      return; 
     } 
     int visibleCount = listBox1.ClientSize.Height/
      ((MyListItem)(listBox1.Items[0])).ItemHeight + 1; 

     if (listBox1.TopIndex == 0) 
      return; 


     if (listBox1.TopIndex + visibleCount > listBox1.Items.Count - 5) 
     { 
      InsertNextBucketOfListItems(); 
      //I try to invalidate and refresh control but with no positive results, while I hold left mouse button down nothing happens. 
      listBox1.Invalidate(); 
      listBox1.Refresh(); 
     } 

    } 

編輯2: 我說我下面的解決方案。

+0

你嘗試過什麼嗎?這個地方更多的是你嘗試過的代碼的具體問題,而不是通用的方向,這更多的是谷歌的用途。 – SpaceSteak

+0

我在項目中添加了一些代碼示例,這是我做的,但沒有結果。現在我試圖找到正確的方向,我應該如何解決我的問題。 – C0x

+0

識別用觸摸屏操作的UI非常重要。使鼠標脫離桌面或手指離開觸控板的程序沒有用處。 –

回答

0

看來我發現了我的問題的解決方案。主要想法是在列表框控件上生成WM_LBUTTONUP事件。

這就是我該怎麼辦:

[DllImport("user32.dll")] 
    static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, UIntPtr dwExtraInfo); 

    private void TimerCheckForListItemsScrollDown(object sender, EventArgs e) 
    { 
     if (listBox1.Items.Count < 1) 
     { 
      return; 
     } 
     int visibleCount = listBox1.ClientSize.Height/
      ((MyListItem)(listBox1.Items[0])).ItemHeight + 1; 

     if (listBox1.TopIndex == 0) 
      return; 


     if (listBox1.TopIndex + visibleCount > listBox1.Items.Count - 5) 
     { 
      InsertNextBucketOfListItems(); 
      //Now is the trick 
      var p = Cursor.Position; 
      //0004- mouse Up 
      mouse_event((uint)0x0004, (uint)p.X, (uint)p.Y, 0, UIntPtr.Zero); 
     } 

    } 

由於是滾動時加載新項目時更新。但是我沒有意識到如何在滾動更新後不需要釋放鼠標按鈕的情況下繼續滾動。

相關問題