【问题标题】:.NET ListView row padding.NET ListView 行填充
【发布时间】:2008-09-11 22:53:25
【问题描述】:

似乎没有办法更改 .NET ListView 中所有行的填充(或行高)。有人有优雅的破解方法吗?

【问题讨论】:

  • 未指定视图会使问题过于宽泛或不清楚。

标签: c# listview


【解决方案1】:

我知道这篇文章已经相当老了,但是,如果您从未找到最佳选择,我有一个 blog post 可能会有所帮助,它涉及使用 LVM_SETICONSPACING。

根据我的博客,

最初,您需要添加:

using System.Runtime.InteropServices;

接下来,您需要导入 DLL,以便您可以利用 SendMessage 来修改 ListView 参数。

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

完成后,创建以下两个函数:

public int MakeLong(short lowPart, short highPart)
{
    return (int)(((ushort)lowPart) | (uint)(highPart << 16));
}

public void ListViewItem_SetSpacing(ListView listview, short leftPadding, short topPadding) 
{     
    const int LVM_FIRST = 0x1000;     
    const int LVM_SETICONSPACING = LVM_FIRST + 53;     
    SendMessage(listview.Handle, LVM_SETICONSPACING, IntPtr.Zero, (IntPtr)MakeLong(leftPadding, topPadding));      
} 

然后要使用该功能,只需传入您的 ListView,并设置值。在示例中,64 像素是图像宽度,32 像素是我的水平间距/填充,100 像素是图像高度,16 像素是我的垂直间距/填充,这两个参数都需要至少 4 像素。

ListViewItem_SetSpacing(this.listView1, 64 + 32, 100 + 16);

【讨论】:

  • 请在您的回答中发布博文中的相关内容。
  • LVM_SETICONSPACING 仅适用于图标视图中的 ListViews。在详细信息视图中更改行填充(而不是行高,正如@Joel Lucsy 所说可以使用图像列表完成)时,有什么方法可以做等效的事情?
  • 53 的值是从哪里来的 const int LVM_SETICONSPACING = LVM_FIRST + 53;?这不应该是一个常量,并带有描述其目的和含义的注释吗?
  • 我问的原因是我正在处理不同的 DPI 并尝试根据比率计算布局。我不知道 53 是否与像素有关,在这种情况下,DPI 会有所不同!= 100%。
【解决方案2】:

一种解决方法是使用与您希望项目一样高的 ImageList。只需用背景颜色填充空白图像。您甚至可以将图像设置为 1 宽,以便在水平方向上不占用太多空间。

【讨论】:

    猜你喜欢
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    相关资源
    最近更新 更多