gpt4 book ai didi

当所选项目不可见时,VirtualMode 中的 C# ListView 会闪烁

转载 作者:太空狗 更新时间:2023-10-30 00:59:00 24 4
gpt4 key购买 nike

我知道复制起来听起来很复杂,但请跟我来:

您有一个 VirtualMode = true 的 ListView。

选择一个项目,向下滚动以使所选项目超出可视区域,然后尝试将另一个项目添加到 ListView。

您会在一瞬间看到它表现异常并看到某种闪烁。如果您将情况升级并尝试非常快地添加大量项目(我每秒添加大约 20 次),您会发现小问题变得非常大。它是闪烁和周围无效项目的组合。

我已经调查了这个问题,似乎 ListView 为所选项目生成了很多 RetrieveVirtualItem 事件(即使它显然不可见)。

似乎当我添加一个新项目(增加 VirtualListSize)时,ListView 首先尝试关注所选项目,然后返回到之前的位置。

有人遇到同样的问题吗?

最佳答案

这里是解决这个问题的派生类。

使用 SetVirtualListSize() 方法代替常规的 VirtualListSize

public class FlickerFreeListView : ListView
{
#region Static Functionality

private static FieldInfo _internalVirtualListSizeField;

static FlickerFreeListView()
{
_internalVirtualListSizeField = typeof(ListView).GetField("virtualListSize", System.Reflection.BindingFlags.NonPublic | BindingFlags.Instance);

if (_internalVirtualListSizeField == null)
{
string msg = "Private field virtualListSize in type System.Windows.Forms.ListView is not found. Workaround is incompatible with installed .NET Framework version, running without workaround.";
Trace.WriteLine(msg);
}
}

#endregion


[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(HandleRef hWnd, int msg, IntPtr wParam, IntPtr lParam);

internal IntPtr SendMessage(int msg, IntPtr wparam, IntPtr lparam)
{
return SendMessage(new HandleRef(this, this.Handle), msg, wparam, lparam);
}

public void SetVirtualListSize(int size)
{
// if workaround incompatible with current framework version (usually MONO)
if (_internalVirtualListSizeField == null)
{
VirtualListSize = size;
}
else
{
if (size < 0)
{
throw new ArgumentException("ListViewVirtualListSizeInvalidArgument");
}

_internalVirtualListSizeField.SetValue(this, size);
if ((base.IsHandleCreated && this.VirtualMode) && !base.DesignMode)
{
SendMessage(0x102f, new IntPtr(size), new IntPtr(2));
}
}
}
}

关于当所选项目不可见时,VirtualMode 中的 C# ListView 会闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1596005/

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