2015-10-04 150 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); 
     } 

    } 

由于是滚动时加载新项目时更新。但是我没有意识到如何在滚动更新后不需要释放鼠标按钮的情况下继续滚动。

相关问题