C# ListBox DrawItem 不工作
C# ListBox DrawItem not working
我想覆盖 ListBox 的 DrawItem 函数,但我失败了。我尝试了来自网络和 msdn 的各种片段,但不知何故它不起作用。 源代码仅用于测试,所以我不关心良好的结构等。我想要一个可以从中学习并可能改进的工作脚本。
我正在使用 MS VS 2015 RC 并通过 Form-Designer 添加事件。
目前我有以下源代码。我的日志 rte 也不显示 drawitem 条目 - 所以它没有被添加。
Form1.cs
using System;
using System.Drawing;
using System.Windows.Forms;
namespace CustomFormElements
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.listBox1.Items.Add("Test");
this.listBox1.Items.Add("Test1");
this.listBox1.Items.Add("Test2");
this.listBox1.Items.Add("Test3");
this.listBox1.Items.AddRange( new Object[] { "Test4", "Test5", "Test6" });
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
}
private void AddToLog(string text)
{
this.richTextBox1.Text = this.richTextBox1.Text + text + "\r\n";
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
this.AddToLog("SelectedIndexChanged");
}
private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
this.AddToLog("DrawItem");
bool isSelected = ((e.State & DrawItemState.Selected) == DrawItemState.Selected);
if (e.Index > -1)
{
/* If the item is selected set the background color to SystemColors.Highlight
or else set the color to either WhiteSmoke or White depending if the item index is even or odd */
Color color = isSelected ? SystemColors.Highlight :
e.Index % 2 == 0 ? Color.Green : Color.SandyBrown;
// Background item brush
SolidBrush backgroundBrush = new SolidBrush(color);
// Text color brush
SolidBrush textBrush = new SolidBrush(e.ForeColor);
// Draw the background
e.Graphics.FillRectangle(backgroundBrush, e.Bounds);
// Draw the text
e.Graphics.DrawString(listBox1.GetItemText(listBox1.Items[e.Index]), e.Font, textBrush, e.Bounds, StringFormat.GenericDefault);
// Clean up
backgroundBrush.Dispose();
textBrush.Dispose();
}
e.DrawFocusRectangle();
}
private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e)
{
this.AddToLog("MeasureItem");
}
private void listBox1_Enter(object sender, EventArgs e)
{
this.AddToLog("Enter");
}
private void listBox1_Leave(object sender, EventArgs e)
{
this.AddToLog("Leave");
}
private void listBox1_Click(object sender, EventArgs e)
{
this.AddToLog("Click");
}
}
}
Form1.Designer.cs
namespace CustomFormElements
{
partial class Form1
{
/// <summary>
/// Erforderliche Designervariable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Verwendete Ressourcen bereinigen.
/// </summary>
/// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Vom Windows Form-Designer generierter Code
/// <summary>
/// Erforderliche Methode für die Designerunterstützung.
/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
/// </summary>
private void InitializeComponent()
{
this.listBox1 = new System.Windows.Forms.ListBox();
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
this.SuspendLayout();
//
// listBox1
//
this.listBox1.FormattingEnabled = true;
this.listBox1.Location = new System.Drawing.Point(13, 13);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(332, 303);
this.listBox1.TabIndex = 0;
this.listBox1.Click += new System.EventHandler(this.listBox1_Click);
this.listBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listBox1_DrawItem);
this.listBox1.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.listBox1_MeasureItem);
this.listBox1.SelectedIndexChanged += new System.EventHandler(this.listBox1_SelectedIndexChanged);
this.listBox1.Enter += new System.EventHandler(this.listBox1_Enter);
this.listBox1.Leave += new System.EventHandler(this.listBox1_Leave);
//
// richTextBox1
//
this.richTextBox1.Location = new System.Drawing.Point(361, 13);
this.richTextBox1.Name = "richTextBox1";
this.richTextBox1.Size = new System.Drawing.Size(479, 303);
this.richTextBox1.TabIndex = 1;
this.richTextBox1.Text = "";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1009, 475);
this.Controls.Add(this.richTextBox1);
this.Controls.Add(this.listBox1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.RichTextBox richTextBox1;
}
}
根据 MSDN ListBox.DrawMode:
This event is used by an owner-drawn ListBox. The event is only raised
when the DrawMode property is set to DrawMode.OwnerDrawFixed or
DrawMode.OwnerDrawVariable. You can use this event to perform the
tasks needed to draw items in the ListBox. If you have a
variable-sized item (when the DrawMode property is set to
DrawMode.OwnerDrawVariable), before drawing an item, the MeasureItem
event is raised. You can create an event handler for the MeasureItem
event to specify the size for the item that you are going to draw in
your event handler for the DrawItem event.
我想覆盖 ListBox 的 DrawItem 函数,但我失败了。我尝试了来自网络和 msdn 的各种片段,但不知何故它不起作用。 源代码仅用于测试,所以我不关心良好的结构等。我想要一个可以从中学习并可能改进的工作脚本。
我正在使用 MS VS 2015 RC 并通过 Form-Designer 添加事件。
目前我有以下源代码。我的日志 rte 也不显示 drawitem 条目 - 所以它没有被添加。
Form1.cs
using System;
using System.Drawing;
using System.Windows.Forms;
namespace CustomFormElements
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.listBox1.Items.Add("Test");
this.listBox1.Items.Add("Test1");
this.listBox1.Items.Add("Test2");
this.listBox1.Items.Add("Test3");
this.listBox1.Items.AddRange( new Object[] { "Test4", "Test5", "Test6" });
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
}
private void AddToLog(string text)
{
this.richTextBox1.Text = this.richTextBox1.Text + text + "\r\n";
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
this.AddToLog("SelectedIndexChanged");
}
private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
this.AddToLog("DrawItem");
bool isSelected = ((e.State & DrawItemState.Selected) == DrawItemState.Selected);
if (e.Index > -1)
{
/* If the item is selected set the background color to SystemColors.Highlight
or else set the color to either WhiteSmoke or White depending if the item index is even or odd */
Color color = isSelected ? SystemColors.Highlight :
e.Index % 2 == 0 ? Color.Green : Color.SandyBrown;
// Background item brush
SolidBrush backgroundBrush = new SolidBrush(color);
// Text color brush
SolidBrush textBrush = new SolidBrush(e.ForeColor);
// Draw the background
e.Graphics.FillRectangle(backgroundBrush, e.Bounds);
// Draw the text
e.Graphics.DrawString(listBox1.GetItemText(listBox1.Items[e.Index]), e.Font, textBrush, e.Bounds, StringFormat.GenericDefault);
// Clean up
backgroundBrush.Dispose();
textBrush.Dispose();
}
e.DrawFocusRectangle();
}
private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e)
{
this.AddToLog("MeasureItem");
}
private void listBox1_Enter(object sender, EventArgs e)
{
this.AddToLog("Enter");
}
private void listBox1_Leave(object sender, EventArgs e)
{
this.AddToLog("Leave");
}
private void listBox1_Click(object sender, EventArgs e)
{
this.AddToLog("Click");
}
}
}
Form1.Designer.cs
namespace CustomFormElements
{
partial class Form1
{
/// <summary>
/// Erforderliche Designervariable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Verwendete Ressourcen bereinigen.
/// </summary>
/// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Vom Windows Form-Designer generierter Code
/// <summary>
/// Erforderliche Methode für die Designerunterstützung.
/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
/// </summary>
private void InitializeComponent()
{
this.listBox1 = new System.Windows.Forms.ListBox();
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
this.SuspendLayout();
//
// listBox1
//
this.listBox1.FormattingEnabled = true;
this.listBox1.Location = new System.Drawing.Point(13, 13);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(332, 303);
this.listBox1.TabIndex = 0;
this.listBox1.Click += new System.EventHandler(this.listBox1_Click);
this.listBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listBox1_DrawItem);
this.listBox1.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.listBox1_MeasureItem);
this.listBox1.SelectedIndexChanged += new System.EventHandler(this.listBox1_SelectedIndexChanged);
this.listBox1.Enter += new System.EventHandler(this.listBox1_Enter);
this.listBox1.Leave += new System.EventHandler(this.listBox1_Leave);
//
// richTextBox1
//
this.richTextBox1.Location = new System.Drawing.Point(361, 13);
this.richTextBox1.Name = "richTextBox1";
this.richTextBox1.Size = new System.Drawing.Size(479, 303);
this.richTextBox1.TabIndex = 1;
this.richTextBox1.Text = "";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1009, 475);
this.Controls.Add(this.richTextBox1);
this.Controls.Add(this.listBox1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.RichTextBox richTextBox1;
}
}
根据 MSDN ListBox.DrawMode:
This event is used by an owner-drawn ListBox. The event is only raised when the DrawMode property is set to DrawMode.OwnerDrawFixed or DrawMode.OwnerDrawVariable. You can use this event to perform the tasks needed to draw items in the ListBox. If you have a variable-sized item (when the DrawMode property is set to DrawMode.OwnerDrawVariable), before drawing an item, the MeasureItem event is raised. You can create an event handler for the MeasureItem event to specify the size for the item that you are going to draw in your event handler for the DrawItem event.