c# Winforms:如何在用鼠标拖动滚动条时更新列表框的滚动条

本文关键字:滚动条 更新 列表 拖动 鼠标 Winforms | 更新日期: 2023-09-27 18:15:50

我有一个列表框,初始数量的项目,它有垂直滚动条。

我已经实现了以下行为:如果我移动(按住鼠标左键)滚动到滚动条的末端,那么一些新项目被添加到Listbox控件。问题是,滚动条的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:

c# Winforms:如何在用鼠标拖动滚动条时更新列表框的滚动条

看来我找到了解决问题的办法。主要思想是在列表框控件上生成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);
       }
   }

因为每次加载新项时滚动都会更新。但是我没有意识到如何在滚动更新后继续滚动而不需要释放鼠标按钮