【问题标题】:How to add a drop shadow to a ListView?如何在 ListView 中添加阴影?
【发布时间】:2015-02-14 06:45:54
【问题描述】:

有没有一种方法可以在不使用第三方组件的情况下在 C#(view = LargeIcon 模式)中向 ListView 项添加阴影?

我能想到的唯一方法是在图像本身上绘制阴影,但是当我点击图像时,阴影也会被突出显示(因为它是图像的一部分!)。那么也许有一种方法可以让 ListView 在我单击某个项目时仅突出显示图像的特定区域?

【问题讨论】:

  • 我猜可以使用自定义绘制方法,但我自己没有这方面的经验。尝试在 Google 上搜索“ListView.DrawItem”。

标签: c# .net winforms visual-studio


【解决方案1】:

最简单的方法是创建一个合适的阴影位图并使用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 的最大高度推导出来的:这里是LargeImageListStateImageList

除非我们想为所有图像添加额外的透明像素,否则我们可以通过添加第二个带有ImageSize 1x100ImageList 并将其指定为StateImageList 来扩大项目的活动高度。需要添加实际的Images!现在项目文本也将选择项目..!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 2020-05-21
    • 2019-06-09
    • 2018-07-19
    • 2013-02-09
    • 2014-10-10
    • 1970-01-01
    相关资源
    最近更新 更多