想实现一个功能:在一个属性面板上,能动态加载一个对象的属性,并能修改它的属性。
举个例子:我画了一条线,当我单击这条线时,能在属性面板上加载上这条线的公开属性。当我画了个矩形并点击它时,也能打到同样效果。只要求如何加载属性,其余的不用考虑。急切等待中(目前我的属性面板是写死的,不能达到要求。)
最好有思路和主要代码。
举个例子:我画了一条线,当我单击这条线时,能在属性面板上加载上这条线的公开属性。当我画了个矩形并点击它时,也能打到同样效果。只要求如何加载属性,其余的不用考虑。急切等待中(目前我的属性面板是写死的,不能达到要求。)
最好有思路和主要代码。
{
PropertyGrid propertyGrid = new PropertyGrid();
List<Line> lines = new List<Line>(); public Form1()
{
lines.Add(new Line() { End = new Point(100, 100), Width = 3 });
lines.Add(new Line() { End = new Point(30, 100) }); this.propertyGrid.Dock = DockStyle.Right;
this.propertyGrid.Width = this.Width / 2;
this.Controls.Add(this.propertyGrid);
this.propertyGrid.PropertyValueChanged += delegate { this.Invalidate(); };
} protected override void OnPaint(PaintEventArgs e)
{
foreach (Line line in this.lines) line.DrawTo(e.Graphics);
} protected override void OnMouseClick(MouseEventArgs e)
{
foreach (Line line in this.lines)
{
if (line.HiTest(e.Location)) { this.propertyGrid.SelectedObject = line; break; }
}
} class Line
{
public Point Start { get; set; }
public Point End { get; set; }
public int Width { get; set; } public void DrawTo(Graphics g)
{
using (Pen pen = new Pen(Brushes.Blue, Math.Max(1, this.Width)))
{
g.DrawLine(pen, this.Start, this.End);
}
}
public bool HiTest(Point p)
{
float deltaX = End.X - Start.X;
float deltaY = End.Y - Start.Y;
float length = (float)Math.Sqrt(deltaX * deltaX + deltaY * deltaY);
PointF normal = new PointF(-deltaY / length, deltaX / length); float dis = (p.X - End.X) * normal.X + (p.Y - End.Y) * normal.Y;
return Math.Abs(dis) < 5;
}
}
}
PropertyGrid控件,你拖出来到窗体上。按1楼的方法,最关键的就是2个:
1.线的拾取,要考虑交叉、叠加、点击的范围。
2.this.propertyGrid.SelectedObject = line
如果要做的好,要仔细看看如何使用Attribute修饰,让对象在PropertyGrid中显示的更好,比如名字,类型。