【问题标题】:C# Winforms: How to update scrollbar of Listbox while dragging scrollbar with mouseC# Winforms:如何在用鼠标拖动滚动条时更新列表框的滚动条
【发布时间】:2015-10-04 12:26:52
【问题描述】:

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

我已经实现了以下行为:如果我移动(按住鼠标左键)滚动到滚动条的末尾,那么一些新项目将添加到 Listbox 控件中。问题是只有当我鼠标左键向上时,列表框的滚动条才会更新(相对于新的列表框项目计数)。但我需要在将新项目添加到列表框后立即更新它,而无需停止向下拖动鼠标。

我想要的正确行为示例:https://www.google.com/fonts。 如您所见,如果您向下拖动滚动条,它会立即更新并在每次加载新项目时向上跳转多个位置。

所以,我的问题是:如何在不使用 3rd 方列表框控件的情况下正确实现此类行为?

编辑:

在我的 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: 我在下面添加了我的解决方案。

【问题讨论】:

  • 你有没有尝试过?这个地方更多的是针对您尝试过的代码的特定问题,而不是通用方向,这更适合 google。
  • 我从项目中添加了一些代码示例,我做了什么,但没有结果。现在我只是试着找到正确的方向我应该如何解决我的问题。
  • 识别使用触摸屏操作的 UI 非常重要。使鼠标从桌子上掉下来或手指从触控板上掉下来的程序是没有用的。

标签: c# winforms listbox


【解决方案1】:

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

   }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2019-11-26
    • 2012-02-08
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多