From 1303209095abb9a1cc91ffca0c17ce4d8704058a Mon Sep 17 00:00:00 2001 From: ARCHI86 Date: Sun, 10 Nov 2024 16:44:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B6=D0=B5=20=D0=BB=D1=83=D1=87=D1=88?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ResizableCanvasPage.xaml.cs | 45 +++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/ResizableCanvasPage.xaml.cs b/ResizableCanvasPage.xaml.cs index 3873c19..427b8d2 100644 --- a/ResizableCanvasPage.xaml.cs +++ b/ResizableCanvasPage.xaml.cs @@ -1,6 +1,7 @@ using Microsoft.Maui.Controls; using Microsoft.Maui.Graphics; using System; + namespace NotesDataAnalyst { public partial class ResizableCanvasPage : ContentPage @@ -14,10 +15,10 @@ namespace NotesDataAnalyst InitializeComponent(); } - // Метод для добавления нового объекта + // Метод для добавления объекта на холст private void AddResizableObject(double x, double y) { - // Создаем Frame как новый объект + // Создание Frame для графического объекта var resizableFrame = new Frame { BackgroundColor = Colors.LightBlue, @@ -27,12 +28,12 @@ namespace NotesDataAnalyst HeightRequest = InitialHeight }; - // Добавляем обработчик перетаскивания + // Обработка перемещения объекта var panGesture = new PanGestureRecognizer(); panGesture.PanUpdated += (s, e) => OnDragPanUpdated(s, e, resizableFrame); resizableFrame.GestureRecognizers.Add(panGesture); - // Добавляем маркер для изменения размера + // Создание ручки для изменения размера var resizeHandle = new BoxView { BackgroundColor = Colors.Gray, @@ -40,76 +41,72 @@ namespace NotesDataAnalyst HeightRequest = 20 }; - // Добавляем обработчик изменения размера + // Обработка изменения размера объекта var resizePanGesture = new PanGestureRecognizer(); resizePanGesture.PanUpdated += (s, e) => OnResizePanUpdated(s, e, resizableFrame, resizeHandle); resizeHandle.GestureRecognizers.Add(resizePanGesture); - // Добавляем элементы на холст + // Позиционирование объекта и ручки AbsoluteLayout.SetLayoutBounds(resizableFrame, new Rect(x, y, InitialWidth, InitialHeight)); CanvasLayout.Children.Add(resizableFrame); + CanvasLayout.Children.Add(resizeHandle); UpdateResizeHandlePosition(resizableFrame, resizeHandle); - CanvasLayout.Children.Add(resizeHandle); } - // Обработчик для перетаскивания объекта + // Обработка перемещения объекта private void OnDragPanUpdated(object sender, PanUpdatedEventArgs e, Frame frame) { if (e.StatusType == GestureStatus.Started) { - // Запоминаем начальную позицию объекта startX = AbsoluteLayout.GetLayoutBounds(frame).X; startY = AbsoluteLayout.GetLayoutBounds(frame).Y; } else if (e.StatusType == GestureStatus.Running) { - // Устанавливаем новую позицию, прибавляя изменение по оси X и Y double x = startX + e.TotalX; double y = startY + e.TotalY; - AbsoluteLayout.SetLayoutBounds(frame, new Rect(x, y, frame.Width, frame.Height)); + AbsoluteLayout.SetLayoutBounds(frame, new Rect(x, y, frame.WidthRequest, frame.HeightRequest)); + UpdateResizeHandlePosition(frame, CanvasLayout.Children[CanvasLayout.Children.IndexOf(frame) + 1] as BoxView); } } - // Обработчик для изменения размера объекта + // Обработка изменения размера объекта private void OnResizePanUpdated(object sender, PanUpdatedEventArgs e, Frame frame, BoxView resizeHandle) { if (e.StatusType == GestureStatus.Started) { - // Запоминаем начальные размеры объекта - startX = frame.Width; - startY = frame.Height; + startX = frame.WidthRequest; + startY = frame.HeightRequest; } else if (e.StatusType == GestureStatus.Running) { - // Изменяем размеры объекта в зависимости от жеста double newWidth = Math.Max(50, startX + e.TotalX); double newHeight = Math.Max(50, startY + e.TotalY); frame.WidthRequest = newWidth; frame.HeightRequest = newHeight; - // Обновляем позицию ручки изменения размера UpdateResizeHandlePosition(frame, resizeHandle); } } - // Метод для обновления позиции ручки изменения размера + // Метод для фиксации позиции ручки в углу объекта private void UpdateResizeHandlePosition(Frame frame, BoxView resizeHandle) { - double x = AbsoluteLayout.GetLayoutBounds(frame).X + frame.WidthRequest - resizeHandle.WidthRequest; - double y = AbsoluteLayout.GetLayoutBounds(frame).Y + frame.HeightRequest - resizeHandle.HeightRequest; + var frameBounds = AbsoluteLayout.GetLayoutBounds(frame); + double x = frameBounds.X + frame.WidthRequest - resizeHandle.WidthRequest / 2; + double y = frameBounds.Y + frame.HeightRequest - resizeHandle.HeightRequest / 2; + AbsoluteLayout.SetLayoutBounds(resizeHandle, new Rect(x, y, resizeHandle.WidthRequest, resizeHandle.HeightRequest)); } - // Пример вызова метода добавления объектов + // Добавление объектов на холст при запуске protected override void OnAppearing() { base.OnAppearing(); - - // Пример добавления нескольких объектов на холст AddResizableObject(100, 100); AddResizableObject(400, 200); AddResizableObject(700, 400); } } -} \ No newline at end of file +}