我已經創建了自定義ListView控件以適應我的需要,並且我遇到了一個問題,導致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
}
是否hapen在標籤頁不可見,在第一坐?另外:你確定OnDrawItem沒有被調用,或者它可能剛剛沒有按照預期工作? (設置一個斷點!) – TaW
我直接在窗體上。我曾經使用選項卡控制,但有問題,所以我逃避了這個方向。我怎麼知道OnDrawItem是否是「被調用的」?我想這可能不會像預期的那樣在第一次抽籤中起作用......我只是無法弄清楚原因。如果在顯示控件後SAME代碼完美無缺,那麼爲什麼不是第一次繪製呢? –
事實上,我認爲OnDrawItem甚至沒有出於某種原因解僱,直到我做了像強制調整大小等內容。 –