Язык программирования C#9 и платформа .NET5
Часть 523 из 642 Информация о книге
private void CanvasDrawingArea_MouseLeftButtonDown(object sender,MouseButtonEventArgs e){Shape shapeToRender = null;// Сконфигурировать корректную фигуру для рисования.switch (_currentShape){case SelectedShape.Circle:shapeToRender = new Ellipse() { Fill = Brushes.Green,Height = 35, Width = 35 };break;case SelectedShape.Rectangle:shapeToRender = new Rectangle(){ Fill = Brushes.Red, Height = 35, Width = 35,RadiusX = 10, RadiusY = 10 };break;case SelectedShape.Line:shapeToRender = new Line(){Stroke = Brushes.Blue,StrokeThickness = 10,X1 = 0, X2 = 50, Y1 = 0, Y2 = 50,StrokeStartLineCap= PenLineCap.Triangle,StrokeEndLineCap = PenLineCap.Round};break;default:return;}<b> // Установить левый верхний угол для рисования на холсте.</b>Canvas.SetLeft(shapeToRender, e.GetPosition(canvasDrawingArea).X);Canvas.SetTop(shapeToRender, e.GetPosition(canvasDrawingArea).Y);<b> // Нарисовать фигуру.</b>canvasDrawingArea.Children.Add(shapeToRender);}На заметку! Возможно, вы заметили, что объекты
,EllipseиRectangle, создаваемые в методеLine, имеют те же настройки свойств, что и соответствующие определения XAML. Вполне ожидаемо, код можно упростить, но это требует понимания объектных ресурсов WPF, которые будут рассматриваться в главе 27.canvasDrawingArea_MouseLeftButtonDown()В коде проверяется переменная-член
с целью создания корректного объекта, производного от_currentShape. Затем устанавливаются координаты левого верхнего угла внутриShapeс использованием входного объектаCanvas. Наконец, в коллекцию объектовMouseButtonEventArgs, поддерживаемуюUIElement, добавляется новый производный отCanvasобъект. Если запустить программу прямо сейчас, то она должна позволить щелкать левой кнопкой мыши где угодно на холсте и визуализировать в позиции щелчка выбранную фигуру.ShapeУдаление прямоугольников, эллипсов и линий с поверхности Canvas
Имея в распоряжении элемент
с коллекцией объектов, может возникнуть вопрос: как динамически удалить элемент, скажем, в ответ на щелчок пользователя правой кнопкой мыши на фигуре? Это делается с помощью классаCanvasиз пространства именVisualTreeHelper. Роль "визуальных деревьев" и "логических деревьев" более подробно объясняется в главе 27, а пока организуйте обработку событияSystem.Windows.MediaобъектаMouseRightButtonDownи реализуйте соответствующий обработчик:Canvasprivate void CanvasDrawingArea_MouseRightButtonDown(object sender,MouseButtonEventArgs e){// Сначала получить координаты x,y позиции,// где пользователь выполнил щелчок.Point pt = e.GetPosition((Canvas)sender);// Использовать метод HitTestO класса VisualTreeHelper, чтобы// выяснить, щелкнул ли пользователь на элементе внутри Canvas.HitTestResult result = VisualTreeHelper.HitTest(canvasDrawingArea, pt);// Если переменная result не равна null, то щелчок произведен на фигуре.if (result != null){// Получить фигуру, на которой совершен щелчок, и удалить ее из Canvas.canvasDrawingArea.Children.Remove(result.VisualHit as Shape);}}Метод начинается с получения точных координат (
,х) позиции, где пользователь щелкнул внутриу, и проверки попадания посредством статического методаCanvas. Возвращаемое значение — объектVisualTreeHelper.HitTest()— будет установлено вHitTestResult, если пользователь выполнил щелчок не наnullвнутриUIElement. Если значениеCanvasне равноHitTestResult, тогда с помощью свойстваnullможно получить объектVisualHit, на котором был совершен щелчок, и привести его к типу, производному отUIElement(вспомните, чтоShapeможет содержать любойCanvas, а не только фигуры). Детали, связанные с "визуальным деревом", будут изложены в главе 27.UIElement