gpt4 book ai didi

c# - ListView Final Column Autosize 创建滚动条

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

我正在实现一个派生自 ListView 的自定义控件。

我希望最后一列填充剩余空间(这是一项很常见的任务),我已经通过覆盖 OnResize 方法来解决这个问题:

     protected override void OnResize(EventArgs e)
{
base.OnResize(e);

if (Columns.Count == 0)
return;
Columns[Columns.Count - 1].Width = -2; // -2 = Fill remaining space
}

或通过其他方法:

        protected override void OnResize(EventArgs e)
{

base.OnResize(e);

if (!_autoFillLastColumn)
return;

if (Columns.Count == 0)
return;

int TotalWidth = 0;
int i = 0;
for (; i < Columns.Count - 1; i++)
{
TotalWidth += Columns[i].Width;
}

Columns[i].Width = this.DisplayRectangle.Width - TotalWidth;
}

编辑:

在我将 ListView 停靠到父容器并通过该控件调整大小之前,这一切正常。控件大小每隔一秒缩小一次(IE,将边框拖动一个像素),我会在底部看到一个滚动条,它根本无法移动(甚至一个像素都没有)。

结果是,当我拖动父级的大小时,我在 ListView 中留下一个闪烁的滚动条,并且有 50% 的机会在拖动停止时它会在那里。

最佳答案

ObjectListView (围绕 .NET WinForms ListView 的开源包装器)允许这种“扩展最后一列以填充可用空间”。实际上比乍看起来更难做到正确——不要相信任何人告诉你的其他情况:)

如果您使用 ObjectListView,您将免费获得该问题以及其他几个问题的解决方案。但如果您想自己完成所有工作,则需要:

  • 使用 ClientSize 而不是 DisplayRectangle(正如@zxpro 已经说过的)
  • 使用 Layout 事件而不是 Resize 事件。
  • 监听 Co​​lumnResized 事件并做同样的工作
  • 不要在设计模式下自动调整大小——这会让人很困惑。

最棘手的问题只有在窗口缩小时才会出现——水平滚动条令人讨厌地闪烁,有时在缩小完成后仍然存在。这似乎正是您的情况。

解决方案是拦截 WM_WINDOWPOSCHANGING 消息并将 ListView 的大小调整为新的大小。

protected override void WndProc(ref Message m) {
switch (m.Msg) {
case 0x46: // WM_WINDOWPOSCHANGING
this.HandleWindowPosChanging(ref m);
base.WndProc(ref m);
break;
default:
base.WndProc(ref m);
break;
}
}

protected virtual void HandleWindowPosChanging(ref Message m) {
const int SWP_NOSIZE = 1;

NativeMethods.WINDOWPOS pos = (NativeMethods.WINDOWPOS)m.GetLParam(typeof(NativeMethods.WINDOWPOS));
if ((pos.flags & SWP_NOSIZE) == 0) {
if (pos.cx < this.Bounds.Width) // only when shrinking
// pos.cx is the window width, not the client area width, so we have to subtract the border widths
this.ResizeFreeSpaceFillingColumns(pos.cx - (this.Bounds.Width - this.ClientSize.Width));
}
}

关于c# - ListView Final Column Autosize 创建滚动条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1377246/

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