想实现一个功能:在一个属性面板上,能动态加载一个对象的属性,并能修改它的属性。
举个例子:我画了一条线,当我单击这条线时,能在属性面板上加载上这条线的公开属性。当我画了个矩形并点击它时,也能打到同样效果。只要求如何加载属性,其余的不用考虑。急切等待中(目前我的属性面板是写死的,不能达到要求。)
最好有思路和主要代码。

解决方案 »

  1.   

    希望你能举一反三。    public partial class Form1 : Form
        {
            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;
                }
            }
        }
      

  2.   

    你自己实现一个属性面板,不是不行。行,但系统已经有了,除非你想做的更好。否则干脆用系统的。
    PropertyGrid控件,你拖出来到窗体上。按1楼的方法,最关键的就是2个:
    1.线的拾取,要考虑交叉、叠加、点击的范围。
    2.this.propertyGrid.SelectedObject = line
    如果要做的好,要仔细看看如何使用Attribute修饰,让对象在PropertyGrid中显示的更好,比如名字,类型。
      

  3.   

    说错了,应该是在wpf中,那个propertygrid好像只能在winform中用,我想在wpf中用
      

  4.   

    3楼的,确实试过了,可以用。在winform 里面用起来相当方便。但是在wpf里面我想了几个方法、都不可行。无奈、时间问题、只能有空在研究。现在有个开源的propertygrid控件是专门供wpf、silverlight用,试过了。也不错。thanks to gomoku.