2016-12-01 58 views
1

我已經創建了自定義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 
} 
+0

是否hapen在標籤頁不可見,在第一坐?另外:你確定OnDrawItem沒有被調用,或者它可能剛剛沒有按照預期工作? (設置一個斷點!) – TaW

+0

我直接在窗體上。我曾經使用選項卡控制,但有問題,所以我逃避了這個方向。我怎麼知道OnDrawItem是否是「被調用的」?我想這可能不會像預期的那樣在第一次抽籤中起作用......我只是無法弄清楚原因。如果在顯示控件後SAME代碼完美無缺,那麼爲什麼不是第一次繪製呢? –

+0

事實上,我認爲OnDrawItem甚至沒有出於某種原因解僱,直到我做了像強制調整大小等內容。 –

回答

3

您需要設置一套控制重繪itsel f調整大小時。因此,在你控制的構造函數添加以下代碼:

this.ResizeRedraw = true; 

enter image description here

+0

[這裏](http://pastebin.com/TYmAkf0S)是用來創建控件的確切代碼。 (WIN8.1 - .NET4.5 - VS2013.4) –

+0

所以在經歷了很多頭痛和時間之後,我發現我的控制權絕對沒有問題。這是你的答案,使我創建另一個控制,就像我現有的控制和測試。令我驚訝的是它效果很好。我只是複製了我現有的非工作控件,並將其粘貼到表單上,然後新的工作!有時VS只是做奇怪的事情...不知何故,我設法弄糟控制的創建對象或什麼... –

+0

事實上,你的代碼爲我工作時,顯示窗體。但是,當調整大小它不工作,所以我添加了'this.ResizeRedraw = true;'固定的大小問題。 –

相關問題