gpt4 book ai didi

c# - 虚拟模式下的闪烁 ListView

转载 作者:行者123 更新时间:2023-11-30 15:32:46 25 4
gpt4 key购买 nike

我在默认的 ListView 中发现了一个不太有趣的错误(不是所有者绘制的!)。当不断向其中添加项目(通过使用 Timer 为例)并且用户试图看到项目稍微远离所选项目时,它会强烈闪烁(向上或向下滚动)。

我是不是做错了什么?

这里是一些重现它的代码:

  • 创建 WindowsFormsApplication1;
  • 将表单 WindowState 设置为最大化;
  • 设置 timer1 表单,将 Enabled 设置为 true;
  • 放入表单 listView1:

        this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
    this.listView1.View = System.Windows.Forms.View.Details;
    this.listView1.VirtualMode = true;
  • 添加一列;

  • 添加事件

        this.listView1.RetrieveVirtualItem += new System.Windows.Forms.RetrieveVirtualItemEventHandler(this.listView1_RetrieveVirtualItem);
  • 最后

    private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
    {
    e.Item = new ListViewItem(e.ItemIndex.ToString());
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
    listView1.VirtualListSize++;
    }

现在运行它并等待 ListView 上的滚动条出现(因为计时器将添加足够的项目),然后:

  • 选择 ListView 中的第一项(使用鼠标或按键),然后使用滚动条或鼠标滚轮向下滚动,这样所选项目就会超出当前 View (向上)。向下滚动越多,闪烁就会变得越严重!看看滚动条在做什么?!?!?

  • 如果向下滚动所选项目,会出现类似的效果。


问题

我该如何处理?想法是有一种不断更新的日志窗口,可以停止自动滚动并向上/向下调查附近的事件。但有了那个kek-effect,这是不可能的!

最佳答案

看起来问题与 Selected/Focused 组合有关(也许 Microsoft 的某个人可以确认)。

这是一个可能的解决方法(它很脏,我相信它!):

    private void timer1_Tick(object sender, EventArgs e)
{
// before adding
if (listView1.SelectedIndices.Count > 0)
{
if (!listView1.Items[listView1.SelectedIndices[0]].Bounds.IntersectsWith(listView1.ClientRectangle))
listView1.TopItem.Focused = true;
else
listView1.Items[listView1.SelectedIndices[0]].Focused = true;
}
// add item
listView1.VirtualListSize++;
}

诀窍是在当前选择的项目离开时之前检查添加新项目(here 是如何检查的主题)。如果项目不在,则暂时将焦点设置到当前 TopItem(直到用户向后滚动,这样所选项目将再次“可见”,这就是它重新获得焦点的时候)。

关于c# - 虚拟模式下的闪烁 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18338470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com