Уже лучше
This commit is contained in:
parent
db62966c32
commit
1303209095
1 changed files with 21 additions and 24 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue