ListView中的图像,下面是文本

时间:2014-11-22 13:07:01

标签: c# listview imagelist

我正在用C#创建一个2D地图编辑器,我一直在尝试在ListView中显示对象,所以它看起来就像这个例子(我不确定示例中的控件是否是一个ListView。它可能是其他东西):

但我似乎无法到达那里!我正在使用带有imageList的ListViewlistView.ViewTile,我正在设置ListViewItem的文本。

它的外观(我添加了一个项目)

我找不到一种方法将项目的文本放在图像旁边而不是旁边,就像在示例中一样。

关于我如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:1)

TaW对他的答案肯定是正确的。然而,View = LargeIcon的问题是项目之间的间距太大,我想首先使用View = Tile,因为项目之间没有间距。所以,经过一番研究,我做了一点,我想出了一个间距的解决方案,这对我来说有点改变。

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    private static extern Int32 SendMessage(IntPtr hwnd, Int32 wMsg, Int32 wParam, Int32 lParam);

    const int LVM_FIRST = 0x1000;
    const int LVM_SETICONSPACING = LVM_FIRST + 53;

    public void SetControlSpacing(Control control, Int16 x, Int16 y)
    {
        SendMessage(control.Handle, LVM_SETICONSPACING, 0, x * 65536 + y);
        control.Refresh();
    }

由于列表控件的默认间距似乎是100(x),100(y),将每个更改为75已修复问题,

listView.View = View.largeIcon;
SetControlSpacing(listView, 75, 75);

现在看起来像这样:

how it looks

感谢您的帮助。

答案 1 :(得分:0)

最简单的解决方案是选择View=LargeIcon。当然确实会将Text的位置更改为 LargeImage。

View=Tiles的解决方案是所有者绘制ListView:

private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
    e.DrawBackground();

    ImageList iList = listView1.LargeImageList;
    Size iSize = iList.ImageSize;
    int fSize2 = 7;

    Rectangle R0 = new Rectangle(Point.Empty, iSize);
    Rectangle R1 = new Rectangle(new Point(e.Bounds.X , e.Bounds.Y ),
                    new Size(iSize.Width - fSize2, iSize.Height - fSize2) );

    e.Graphics.DrawImage(iList.Images[e.Item.ImageIndex], R1, R0, GraphicsUnit.Pixel);

    e.Graphics.DrawString(e.Item.Text, Font, Brushes.Black, 
                          2f, e.Bounds.Y + iSize.Height - fSize2);

}

请注意,ItemHeight始终受所选Image.Height的{​​{1}}限制,所以我缩小图片以便为其下方的文字腾出空间。