Member 13057435 Ответов: 0

Как обновить значения фигуры в Редакторе свойств


Хорошо..
я создаю приложение wpf, в котором, если я перетаскиваю фигуры на холст, они добавляются на холст.


Но у меня есть кнопка selectshape, которую я использую для выбора фигуры, после чего, если я выберу определенную фигуру, она должна отображать свойства этой фигуры в Редакторе свойств.

это мой код для xaml...

<Border BorderThickness="2" BorderBrush="LightBlue" Margin="106,41,208,0" Width="390">
          <Canvas Name="canvas1" Background="Transparent" MouseLeftButtonDown="OnMouseLeftButtonDown" MouseMove="OnMouseMove" MouseLeftButtonUp="OnMouseLeftButtonUp" Height="366" Width="386">

          </Canvas>
      </Border>


это метод, который добавляет формы...это хорошо работает..

private void AddShape(Point pt1, Point pt2,  string s) 
        {
            path = new Path();
            path.Fill = fillBrush;
            path.Width = canvas1.Width;
            
            path.Height = canvas1.Height;
            path.Stroke = strokeBrush; 
            
            path.StrokeThickness = originalStrokeThickness; 
            if (s == "rectangle") 
            { 
                RectangleGeometry geometry = new RectangleGeometry(); 
                //double width = Math.Abs(pt1.X - pt2.X); 
                //double height = Math.Abs(pt1.Y - pt2.Y); 
                shapename = "Rectangle";
                normalizepoints();
                left = Math.Min(startPoint.X, currentPoint.X); 
                top = Math.Min(startPoint.Y, currentPoint.Y); 
                geometry.Rect = new Rect(left, top, width, height); 
                path.Data = geometry;
                path.Name=shapename;
                savedShape.Add(path);
            }
            else if (s == "ellipse")
            {
                EllipseGeometry geometry = new EllipseGeometry();
                //double width = Math.Abs(pt1.X - pt2.X);
                //double height = Math.Abs(pt1.Y - pt2.Y);
                shapename = "Ellipse";
                normalizepoints();
                 left = Math.Min(startPoint.X, currentPoint.X);
                 top = Math.Min(startPoint.Y, currentPoint.Y);
               
                geometry.Center = new Point(left + width / 2, top + height / 2);
                geometry.RadiusX = width / 2;
                geometry.RadiusY = height / 2;
               
                path.Data = geometry;
                path.Name = shapename;
                savedShape.Add(path);
            }
            else if (s == "hexagon")
            {
                shapename = "Hexagon";
                normalizepoints();
                if (startPoint.X < currentPoint.X)
                {
                    PolyLineSegment hexa = new PolyLineSegment(new Point[] 
            {
                
                //new Point(startPoint.X, startPoint.Y),
                //new Point(startPoint.X+width/2, startPoint.Y+height),
                //new Point(startPoint.X+width, startPoint.Y),
                
                
                new Point(startPoint.X, startPoint.Y),
                new Point(startPoint.X+width/4, startPoint.Y-height/2),
                new Point(startPoint.X+(0.75*width), startPoint.Y-height/2),
                new Point(startPoint.X+width, startPoint.Y),
                new Point(startPoint.X+(0.75*width), startPoint.Y+height/2),
                new Point(startPoint.X+width/4, startPoint.Y+height/2),
                new Point(startPoint.X, startPoint.Y)
                               

            }, true);

                    PathFigure pa = new PathFigure(new Point(startPoint.X, startPoint.Y), new PathSegment[] { hexa }, true
                       );
                    PathGeometry pg = new PathGeometry(new PathFigure[] { pa });
                    path.Name = shapename;
                    path.Data = pg;
                    savedShape.Add(path);
                
                }
                else
                {
                    PolyLineSegment hexd = new PolyLineSegment(new Point[] 
            {
                
                //new Point(startPoint.X, startPoint.Y),
                //new Point(startPoint.X+width/2, startPoint.Y+height),
                //new Point(startPoint.X+width, startPoint.Y),
                
                
                new Point(startPoint.X, startPoint.Y),
                new Point(startPoint.X-width/4, startPoint.Y-height/2),
                new Point(startPoint.X-(0.75*width), startPoint.Y-height/2),
                new Point(startPoint.X-width, startPoint.Y),
                new Point(startPoint.X-(0.75*width), startPoint.Y+height/2),
                new Point(startPoint.X-width/4, startPoint.Y+height/2),
                new Point(startPoint.X, startPoint.Y)
                   

                }, true);

                    PathFigure pa = new PathFigure(new Point(startPoint.X, startPoint.Y), new PathSegment[] { hexd }, true
                   );
                    PathGeometry pg = new PathGeometry(new PathFigure[] { pa });
                    path.Name = shapename;
                    path.Data = pg;
                    savedShape.Add(path);
                
                }
               
               
                
            }
            
            canvas1.Children.Add(path);
            showproperty();
            Canvas.SetTop(path, 0);
            Canvas.SetLeft(path, 0);
            
        }
.



Но если я выбираю фигуру на холсте, она не обновляет редактор свойств, хотя я создал класс свойств со свойствами width,height и name..

это мой код для выбора...

if (!canvas1.IsMouseCaptured)
           {
              startPoint = e.GetPosition(canvas1);
           //   selectedPoint = e.GetPosition(canvas1);

               canvas1.CaptureMouse();
               if (rbSelect.IsChecked == true)
               {
                   hitArea = new PointHitTestParameters(startPoint);


                   // Call HitTest method:
                   VisualTreeHelper.HitTest(canvas1, null,
                       new HitTestResultCallback(HitTestCallback),
                       new PointHitTestParameters(startPoint));




               Breakloops:
                   selectedShape = (Path)e.Source;
               foreach (PropertyClass datareal in classdata)
               {

                   foreach (Path path in savedShape)
                   {
                      // MessageBox.Show(path.GeometryTransform.DependencyObjectType.Name);
                       path.StrokeThickness = originalStrokeThickness;
                       if ((path.Name == "Rectangle") && (datareal.Name == "Rectangle"))
                       {
                           var dst = new PropertyClass();
                           dst.Height = datareal.Height;
                           dst.Width = datareal.Width;
                           dst.Name = datareal.Name;
                           xpropertyGrid.DataObject = dst;
                           break;

                       }
                       if ((path.Name == "Ellipse") && (datareal.Name == "Ellipse"))
                       {
                           var dst = new PropertyClass();
                           dst.Height = datareal.Height;
                           dst.Width = datareal.Width;
                           dst.Name = datareal.Name;
                           MessageBox.Show(dst.Name.ToString());
                           xpropertyGrid.DataObject = dst;
                           break;

                       }

                       if ((path.Name == "Hexagon") && (datareal.Name == "Hexagon"))
                       {
                           var dst = new PropertyClass();
                           dst.Height = datareal.Height;
                           dst.Width = datareal.Width;
                           dst.Name = datareal.Name;
                           // MessageBox.Show(dst.Name.ToString());
                           xpropertyGrid.DataObject = dst;
                           break;

                       }

                       // MessageBox.Show(path.Name);

                   }
                   break;
               }

                   selectedShape.StrokeThickness = selectedStrokeThickness;
                   fillBrush = (SolidColorBrush)selectedShape.Fill;
                   e.Handled = true;
                   //pst.Height=






               }


Что я уже пробовал:

Я пробовал использовать hittest, но дело в том, что моя selectedshape не говорит мне, какую форму я выбираю..

я также собрал фигуры в список и использовал оператор foreach, чтобы пройти через него, но все, что я хочу, это чтобы во время цикла просто получить выбранную фигуру, чтобы я мог обновить ее свойства в окне свойств

Erik Rude

Реализовали ли вы INotifyPropertyChanged для своих объектов?

0 Ответов