我想将UI元素添加到Winforms中的ListBox。 当我添加一个Elipse或一个Rectangle时 - 我在列表中得到的是Object.ToString()。 当我将UI元素插入ListBox.Items时,我如何获得WPF的行为 - 我将看到我插入的对象而不是它的字符串表示?
答案 0 :(得分:1)
一个起点是声明一个适合做绘制形状所需的界面。您的具体Shape类应该实现该接口:
public interface IShape {
Rectangle Measure();
void Draw(Graphics g);
// etc...
}
您应该将ListBox的DrawMode属性设置为DrawMode.OwnerDrawVariable。这要求您实现其MeasureItem事件处理程序,需要确定列表框项目显示形状的大小:
void listBox1_MeasureItem(object sender, MeasureItemEventArgs e) {
e.ItemWidth = listBox1.ClientSize.Width;
var shape = listBox1.Items[e.Index] as IShape;
if (shape != null) e.ItemHeight = shape.Measure().Height;
}
您需要为DrawItem事件实现一个事件处理程序来绘制形状:
void listBox1_DrawItem(object sender, DrawItemEventArgs e) {
e.DrawBackground();
var shape = listBox1.Items[e.Index] as IShape;
if (shape != null) shape.Draw(e.Graphics);
e.DrawFocusRectangle();
}