我正在用C#创建一个2D地图编辑器,我一直在尝试在ListView
中显示对象,所以它看起来就像这个例子(我不确定示例中的控件是否是一个ListView。它可能是其他东西):
但我似乎无法到达那里!我正在使用带有imageList的ListView
,listView.View
是Tile
,我正在设置ListViewItem的文本。
它的外观(我添加了一个项目)
我找不到一种方法将项目的文本放在图像旁边而不是旁边,就像在示例中一样。
关于我如何做到这一点的任何想法?
答案 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);
现在看起来像这样:
感谢您的帮助。
答案 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}}限制,所以我缩小图片以便为其下方的文字腾出空间。