我的列表框中包含初始项目数,并且它具有垂直滚动条。
我已经实现了以下行为:如果我移动(按住鼠标左键)滚动到滚动条的末尾,则会向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 :(得分: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);
}
}
由于每次加载新项目时都会更新滚动。但是我没有意识到滚动更新后如何继续滚动而不需要释放鼠标按钮。