Уже лучше

This commit is contained in:
ARCHI86 2024-11-10 16:44:47 +03:00
parent db62966c32
commit 1303209095

View file

@ -1,6 +1,7 @@
using Microsoft.Maui.Controls; using Microsoft.Maui.Controls;
using Microsoft.Maui.Graphics; using Microsoft.Maui.Graphics;
using System; using System;
namespace NotesDataAnalyst namespace NotesDataAnalyst
{ {
public partial class ResizableCanvasPage : ContentPage public partial class ResizableCanvasPage : ContentPage
@ -14,10 +15,10 @@ namespace NotesDataAnalyst
InitializeComponent(); InitializeComponent();
} }
// Метод для добавления нового объекта // Метод для добавления объекта на холст
private void AddResizableObject(double x, double y) private void AddResizableObject(double x, double y)
{ {
// Создаем Frame как новый объект // Создание Frame для графического объекта
var resizableFrame = new Frame var resizableFrame = new Frame
{ {
BackgroundColor = Colors.LightBlue, BackgroundColor = Colors.LightBlue,
@ -27,12 +28,12 @@ namespace NotesDataAnalyst
HeightRequest = InitialHeight HeightRequest = InitialHeight
}; };
// Добавляем обработчик перетаскивания // Обработка перемещения объекта
var panGesture = new PanGestureRecognizer(); var panGesture = new PanGestureRecognizer();
panGesture.PanUpdated += (s, e) => OnDragPanUpdated(s, e, resizableFrame); panGesture.PanUpdated += (s, e) => OnDragPanUpdated(s, e, resizableFrame);
resizableFrame.GestureRecognizers.Add(panGesture); resizableFrame.GestureRecognizers.Add(panGesture);
// Добавляем маркер для изменения размера // Создание ручки для изменения размера
var resizeHandle = new BoxView var resizeHandle = new BoxView
{ {
BackgroundColor = Colors.Gray, BackgroundColor = Colors.Gray,
@ -40,76 +41,72 @@ namespace NotesDataAnalyst
HeightRequest = 20 HeightRequest = 20
}; };
// Добавляем обработчик изменения размера // Обработка изменения размера объекта
var resizePanGesture = new PanGestureRecognizer(); var resizePanGesture = new PanGestureRecognizer();
resizePanGesture.PanUpdated += (s, e) => OnResizePanUpdated(s, e, resizableFrame, resizeHandle); resizePanGesture.PanUpdated += (s, e) => OnResizePanUpdated(s, e, resizableFrame, resizeHandle);
resizeHandle.GestureRecognizers.Add(resizePanGesture); resizeHandle.GestureRecognizers.Add(resizePanGesture);
// Добавляем элементы на холст // Позиционирование объекта и ручки
AbsoluteLayout.SetLayoutBounds(resizableFrame, new Rect(x, y, InitialWidth, InitialHeight)); AbsoluteLayout.SetLayoutBounds(resizableFrame, new Rect(x, y, InitialWidth, InitialHeight));
CanvasLayout.Children.Add(resizableFrame); CanvasLayout.Children.Add(resizableFrame);
CanvasLayout.Children.Add(resizeHandle);
UpdateResizeHandlePosition(resizableFrame, resizeHandle); UpdateResizeHandlePosition(resizableFrame, resizeHandle);
CanvasLayout.Children.Add(resizeHandle);
} }
// Обработчик для перетаскивания объекта // Обработка перемещения объекта
private void OnDragPanUpdated(object sender, PanUpdatedEventArgs e, Frame frame) private void OnDragPanUpdated(object sender, PanUpdatedEventArgs e, Frame frame)
{ {
if (e.StatusType == GestureStatus.Started) if (e.StatusType == GestureStatus.Started)
{ {
// Запоминаем начальную позицию объекта
startX = AbsoluteLayout.GetLayoutBounds(frame).X; startX = AbsoluteLayout.GetLayoutBounds(frame).X;
startY = AbsoluteLayout.GetLayoutBounds(frame).Y; startY = AbsoluteLayout.GetLayoutBounds(frame).Y;
} }
else if (e.StatusType == GestureStatus.Running) else if (e.StatusType == GestureStatus.Running)
{ {
// Устанавливаем новую позицию, прибавляя изменение по оси X и Y
double x = startX + e.TotalX; double x = startX + e.TotalX;
double y = startY + e.TotalY; 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) private void OnResizePanUpdated(object sender, PanUpdatedEventArgs e, Frame frame, BoxView resizeHandle)
{ {
if (e.StatusType == GestureStatus.Started) if (e.StatusType == GestureStatus.Started)
{ {
// Запоминаем начальные размеры объекта startX = frame.WidthRequest;
startX = frame.Width; startY = frame.HeightRequest;
startY = frame.Height;
} }
else if (e.StatusType == GestureStatus.Running) else if (e.StatusType == GestureStatus.Running)
{ {
// Изменяем размеры объекта в зависимости от жеста
double newWidth = Math.Max(50, startX + e.TotalX); double newWidth = Math.Max(50, startX + e.TotalX);
double newHeight = Math.Max(50, startY + e.TotalY); double newHeight = Math.Max(50, startY + e.TotalY);
frame.WidthRequest = newWidth; frame.WidthRequest = newWidth;
frame.HeightRequest = newHeight; frame.HeightRequest = newHeight;
// Обновляем позицию ручки изменения размера
UpdateResizeHandlePosition(frame, resizeHandle); UpdateResizeHandlePosition(frame, resizeHandle);
} }
} }
// Метод для обновления позиции ручки изменения размера // Метод для фиксации позиции ручки в углу объекта
private void UpdateResizeHandlePosition(Frame frame, BoxView resizeHandle) private void UpdateResizeHandlePosition(Frame frame, BoxView resizeHandle)
{ {
double x = AbsoluteLayout.GetLayoutBounds(frame).X + frame.WidthRequest - resizeHandle.WidthRequest; var frameBounds = AbsoluteLayout.GetLayoutBounds(frame);
double y = AbsoluteLayout.GetLayoutBounds(frame).Y + frame.HeightRequest - resizeHandle.HeightRequest; 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)); AbsoluteLayout.SetLayoutBounds(resizeHandle, new Rect(x, y, resizeHandle.WidthRequest, resizeHandle.HeightRequest));
} }
// Пример вызова метода добавления объектов // Добавление объектов на холст при запуске
protected override void OnAppearing() protected override void OnAppearing()
{ {
base.OnAppearing(); base.OnAppearing();
// Пример добавления нескольких объектов на холст
AddResizableObject(100, 100); AddResizableObject(100, 100);
AddResizableObject(400, 200); AddResizableObject(400, 200);
AddResizableObject(700, 400); AddResizableObject(700, 400);
} }
} }
} }