2012-10-11 54 views
3

我想增加列表框中項目的高度 - 基本上在內部填充它們。除此之外,我不想更改默認的列表框行爲。我遵循MSDN示例來做所有者繪製列表項,但是我遇到了問題。默認列表框用黑色高亮顯示黑色項目和白色選定項目。要做到這一點相同的功能我用下面的代碼在DRAWITEM事件處理程序:所有者繪製的列表框不繪製先前選定的項目

private void listBox1_DrawItem(object sender, DrawItemEventArgs e) 
    { 
     Brush b = (e.Index == ((ListBox)sender).SelectedIndex ? Brushes.White : Brushes.Black); 
     e.DrawBackground(); 
     e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, b, new Rectangle(new Point(e.Bounds.X, e.Bounds.Y + 2), e.Bounds.Size)); 
     e.DrawFocusRectangle(); 
    } 

這似乎是工作,除了當我點擊周圍的列表罰款。所選項目在藍色背景上顯示爲白色文本,但先前選擇的項目保持白色。看起來好像我選擇的項目被重新繪製,但之前選擇的項目不是。如果我移動到另一個控件,列表框重繪得很好。我錯過了什麼?

+0

使用SelectedIndex是錯誤的,它的值在不可預測的時刻發生變化。您必須改用e.State。 –

回答

2

要添加填充到列表框,只需將列表框的.ItemHeight設置爲某個高度。

否則,如果要執行所有者繪製,而不是手動選擇顏色,請使用e.ForeColor。像這樣:

Brush b = new SolidBrush(e.ForeColor); 

請注意,在這種情況下,您將不得不爲後面的選定項目繪製背景。 檢查列表框項目的國家可以這樣進行:

e.Graphics.FillRectangle((e.State & DrawItemState.Selected) != 0 ? SystemBrushes.Highlight : SystemBrushes.Window, new Rectangle(new Point(e.Bounds.X, e.Bounds.Y + 2), e.Bounds.Size)); 
0

答:ListBox.SelectedIndex很不合理(如漢斯說),但e.ForeColor是相當正確的。改爲使用它。與e.ForeColor == SystemColors.HighlightText

 

支持數據e.Index == ((ListBox)sender).SelectedIndex

替換代碼

此行添加到的listBox1_DrawItem頂部:

Console.WriteLine("e.Index=" + e.Index + " SelectedIndex=" + 
    listBox1.SelectedIndex + " ForeColor=" + e.ForeColor); 

它產生這樣的輸出(//註釋)

// Added 4 items to listbox 
e.Index=0 SelectedIndex=-1 ForeColor=Color [WindowText] 
e.Index=1 SelectedIndex=-1 ForeColor=Color [WindowText] 
e.Index=2 SelectedIndex=-1 ForeColor=Color [WindowText] 
e.Index=3 SelectedIndex=-1 ForeColor=Color [WindowText] 

// MouseDown on item 0 
e.Index=0 SelectedIndex=-1 ForeColor=Color [WindowText] 
e.Index=0 SelectedIndex=0 ForeColor=Color [HighlightText] 
e.Index=0 SelectedIndex=0 ForeColor=Color [HighlightText] 
e.Index=0 SelectedIndex=0 ForeColor=Color [HighlightText] 
e.Index=0 SelectedIndex=0 ForeColor=Color [HighlightText] 
e.Index=0 SelectedIndex=0 ForeColor=Color [HighlightText] 
e.Index=1 SelectedIndex=0 ForeColor=Color [WindowText] 
e.Index=2 SelectedIndex=0 ForeColor=Color [WindowText] 
e.Index=3 SelectedIndex=0 ForeColor=Color [WindowText] 
e.Index=0 SelectedIndex=0 ForeColor=Color [HighlightText] 
// MouseUp on item 0 (no DrawItem events) 

// MouseDown for item 1 
e.Index=0 SelectedIndex=0 ForeColor=Color [HighlightText] 
e.Index=0 SelectedIndex=0 ForeColor=Color [WindowText] 
e.Index=1 SelectedIndex=1 ForeColor=Color [HighlightText] 
e.Index=1 SelectedIndex=1 ForeColor=Color [HighlightText] 
// MouseUp for item 1 (no DrawItem events) 

// MouseDown for item 2 
e.Index=1 SelectedIndex=1 ForeColor=Color [HighlightText] 
e.Index=1 SelectedIndex=1 ForeColor=Color [WindowText] 
e.Index=2 SelectedIndex=2 ForeColor=Color [HighlightText] 
e.Index=2 SelectedIndex=2 ForeColor=Color [HighlightText] 

// Drag to item 3 
e.Index=2 SelectedIndex=2 ForeColor=Color [HighlightText] 
e.Index=2 SelectedIndex=2 ForeColor=Color [WindowText] 
e.Index=3 SelectedIndex=3 ForeColor=Color [HighlightText] 
e.Index=3 SelectedIndex=3 ForeColor=Color [HighlightText] 
// MouseUp over item 3 (no DrawItem events) 

所以基本上...列表框可能吸引超過我們想要的,但你最終在最後繪製獲得正確的色彩。

我也推薦DoubleBuffering

相關問題