我想增加列表框中项目的高度 - 基本上是在内部填充它们。除此之外,我不想更改默认的列表框行为。我已经按照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 :(得分: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));
答案 1 :(得分:0)
答案: ListBox.SelectedIndex
非常不合理(就像Hans说的那样),但e.ForeColor
是正确的。请改用它。
替换您的代码:e.Index == ((ListBox)sender).SelectedIndex
e.ForeColor == SystemColors.HighlightText
支持数据:
将此行添加到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)
所以基本上...... ListBox可能比我们想要的更多,但你最终在最后一次抽奖时得到了正确的颜色。
我还建议DoubleBuffering。