如何阴影添加到ListView?(How to add a drop shadow to a Lis

2019-10-21 21:25发布

有没有一种方法,我可以添加一个阴影在C#中(一个ListView项目view = LargeIcon不使用第三方组件模式)?

我能想到的唯一的办法是通过绘制图像本身的阴影,但这样一来,当我点击图像,投影也将被高亮显示(因为它是图像的一部分!)。 因此,也许有一种方法,使当我点击一个项目的ListView只强调图像的特定区域?

Answer 1:

最简单的方法是创建一个合适的阴影效果的位图和使用OwnerDrawingListView项目。

下面是一个例子:

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);
}

它使用Images在一个64x64 ImageList ,并用阴影(在Photoshop中创建)一个合适的80×80位图:

以可视化的选择我覆盖有半透明图像Bitmap overlay 。 下面是结果:

:由于是,结果有个微妙的问题:点击文本不会选择项目。 补救的办法是一个简单的解决方法..:

ItemHeight不能直接设置。 相反,它是从分配和适用的最大高度导出ImageLists在这里: LargeImageListStateImageList

除非我们想额外的透明像素添加到我们的所有图像,我们可以通过添加第二放大项目的有效高度ImageListImageSize 1x100 ,并指定其为StateImageList 。 氖需要添加实际的Images ! 现在,该项目的文本也将选择的项目..!



文章来源: How to add a drop shadow to a ListView?