如何使用视图样式View.SmallIcon在Winforms ListView中将列设置为固定大小

时间:2012-01-31 01:59:15

标签: c# .net winforms listview

我有一个C#Winforms应用程序并使用ListView控件。当我将View属性设置为View.SmallIcon时,图标不会对齐到固定大小的列。这些物品遍布各处。

是否有一个属性可以在ListView控件上设置,以便在SmallIcon视图中生成固定大小的列。

更新
下面是描述我遇到的问题的屏幕截图。屏幕截图#1显示了Windows资源管理器,其中文件名的宽度是固定的,并且引入了省略号。虽然从技术上讲可能没有任何实际的列,但图标以“柱状”类型布局对齐。 Image http://www.barramsoft.com/pub/images/ListViewSmallIcons2.png

屏幕截图#2显示了我遇到的情况。图标有一个不太漂亮的布局: Image http://www.barramsoft.com/pub/images/ListViewSmallIcons.png

4 个答案:

答案 0 :(得分:1)

使用列的唯一视图是“详细信息”视图。

“小图标”视图与“大图标”视图相同,除了较小的图标。图标可以定位在整个控件上。您可以通过更改视图在Windows资源管理器中自行玩这个;它使用ListView控件。

如果要强制图标以漂亮的小行排列,请将Alignment属性与AutoArrange属性结合使用。

Alignment设置为ListViewAlignment.TopListViewAlignment.Left,将AutoArrange设置为true,以使图标自动排列在此位置。

您可以在设计人员中或通过代码执行此操作:

myListView.Alignment   = ListViewAlignment.Top;
myListView.AutoArrange = true;

答案 1 :(得分:1)

您可以尝试免费软件Better ListView Express component,它会显示SmallIcon视图中始终对齐的项目,与Windows资源管理器完全一样。

您还可以在所有视图中显示列标题(不仅仅是详细信息),这在.NET ListView中是不可能的。

ComponentOwl还提供了一个包含许多额外功能的完整版本。

答案 2 :(得分:1)

我通过控制文本长度来解决这个问题:

   int max_length = 30; // you can use any value here

   ListViewItem l = lsvLocalFile.Items.Add("some text value");
   l.ImageIndex = index_of_smallimagelist;
   if (l.Text.Length > max_length) 
       l.Text = l.Text.Remove(max_length - 3) + "...";
   else
       l.Text = l.Text.PadRight(max_length);

答案 3 :(得分:0)

我也有这个问题。我通过使用fileNamesListView.Columns.Add(new ColumnHeader());向ListView添加列然后将fileNamesListView.Columns[0].Width设置为最长项目文本及其图像的宽度来解决此问题。缺点是所有列都是最宽列的宽度。

private void PopulateListView(List<string> fileNames)
{
    using (Graphics g = this.CreateGraphics())
    {
        int longestTextWidth = 0;
        int longestTextIndex = 0;

        for (int i = 0; i < fileNames.Count; i++)
        {
            ListViewItem item = new ListViewItem(fileNames[i]);
            item.ImageIndex = 0; // Do whatever you do to choose the image.
            fileNamesListView.Items.Add(item);

            // Find the longest file name.
            int textWidth = Size.Round(g.MeasureString(fileNames[i], fileNamesListView.Font)).Width;
            if (textWidth > longestTextWidth)
            {
                longestTextWidth = textWidth;
                longestTextIndex = i;
            }
        }

        // Find the width of the image used.
        int imageWidth = filesImageList.Images[fileNamesListView.Items[longestTextIndex].ImageIndex].Width;

        fileNamesListView.Columns[0].Width = longestTextWidth + imageWidth;
    }
}