首次显示时,自定义ListView控件不会绘制

时间:2016-12-01 20:31:34

标签: c# winforms listview ownerdrawn

我已经创建了一个自定义ListView控件以满足我的需求,并且我遇到了一个问题,导致ListView在表单首次加载时不显示任何内容(不绘制任何内容,只是白色)。

如果我调整表单大小或单击我的控件(任何强制在ListView上重绘的内容),那么它会按预期显示。

作为旁注,它曾经工作得很好,直到我今天做了一个小改动并重建了控件。我删除了所做的所有更改并重新重建,但问题仍然存在。关于为什么在首次加载表单时它不会显示(绘画)的任何想法?

这是我在自定义ListView控件上使用自定义绘图...

protected override void OnDrawItem(DrawListViewItemEventArgs e)
{
    Image image = e.Item.ImageList.Images[e.Item.ImageIndex];
    Size textSize = new Size((int)e.Graphics.MeasureString(e.Item.Text, e.Item.Font).Width, (int)e.Graphics.MeasureString(e.Item.Text, e.Item.Font).Height);

    //Get the area of the item to be painted
    Rectangle bounds = e.Bounds;
    bounds.X = 0;
    bounds.Width = this.Width;

    //Set the spacing on the list view items
    int hPadding = 0;
    int vPadding = 0;
    IntPtr padding = (IntPtr)(int)(((ushort)(hPadding + bounds.Width)) | (uint)((vPadding + bounds.Height) << 16));
    SendMessage(this.Handle, (uint)ListViewMessage.LVM_SETICONSPACING, IntPtr.Zero, padding);

    //Set the positions of the image and text
    int imageLeft = (bounds.Width / 2) - (image.Width / 2);
    int imageTop = bounds.Top + 3;
    int textLeft = (bounds.Width / 2) - (textSize.Width / 2);
    int textTop = imageTop + image.Height;
    Point imagePosition = new Point(imageLeft, imageTop);
    Point textPosition = new Point(textLeft, textTop);

    //Draw background
    using (Brush brush = new SolidBrush(e.Item.BackColor))
        e.Graphics.FillRectangle(brush, bounds);

    //Draw selected
    if (e.Item.Selected)
    {
        using (Brush brush = new SolidBrush(m_SelectedColor))
            e.Graphics.FillRectangle(brush, bounds);
    }

    //Draw image
    e.Graphics.DrawImage(image, imagePosition);

    //Draw text
    e.Graphics.DrawString(e.Item.Text, e.Item.Font, new SolidBrush(e.Item.ForeColor), textPosition);
}

我还在自定义控件的构造函数中设置了以下内容......

public MyListView()
{
    this.DoubleBuffered = true;
    this.OwnerDraw = true;
    this.View = View.LargeIcon;
    this.Cursor = Cursors.Hand;
    this.Scrollable = false;
}

我还继承了ListView类......

public class MyListView : ListView
{
    //All my source
}

1 个答案:

答案 0 :(得分:3)

您需要将控件设置为在调整大小时重绘自身。因此,在控件的构造函数中添加此代码:

this.ResizeRedraw = true;

enter image description here