最简单的方法是创建一个合适的阴影位图并使用OwnerDrawing ListView 项目。
这是一个例子:
public Form1()
{
InitializeComponent();
shadow = (Bitmap)Image.FromFile(aDropShadowBitmap);
overlay = new Bitmap(64, 64);
using (Graphics G = Graphics.FromImage(overlay))
G.Clear(Color.FromArgb(127, 31, 191, 255));
}
Bitmap shadow;
Bitmap overlay;
private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
ListViewItem item = e.Item;
Point bLoc = new Point(e.Bounds.X + 35, e.Bounds.Y + 10);
Size imgS = imageList1.ImageSize;
e.Graphics.DrawImage(shadow, bLoc);
e.Graphics.DrawImage(imageList1.Images[e.ItemIndex], bLoc);
if ((e.State & ListViewItemStates.Selected) == ListViewItemStates.Selected)
{
e.Graphics.DrawImage(overlay, bLoc);
}
else { }
e.Graphics.DrawString(item.Text, listView1.Font, Brushes.Black,
bLoc.X, bLoc.Y + imgS.Height + 10);
}
它在64x64 ImageList 中使用Images 和带有阴影的合适的80x80 位图(在Photoshop 中创建):
为了可视化选择,我用半透明的Bitmap overlay 覆盖图像。结果如下:
注意:结果有一个微妙的错误:点击文本不会选择项目。补救措施是一个简单的解决方法..:
ItemHeight 不能直接设置。相反,它是从分配的和适用的ImageLists 的最大高度推导出来的:这里是LargeImageList 和StateImageList。
除非我们想为所有图像添加额外的透明像素,否则我们可以通过添加第二个带有ImageSize 1x100 的ImageList 并将其指定为StateImageList 来扩大项目的活动高度。需要添加实际的Images!现在项目文本也将选择项目..!