Как обновить значения фигуры в Редакторе свойств
Хорошо..
я создаю приложение 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 для своих объектов?