Доработара WinUI реализация.

This commit is contained in:
2026-01-25 05:36:28 +03:00
parent bbb20edb03
commit 6ad7b5dcdb
20 changed files with 1089 additions and 1801 deletions

View File

@@ -7,8 +7,18 @@ using System;
namespace Lattice.UI.DragDrop.WinUI.Controls;
/// <summary>
/// Визуальный элемент для отображения перетаскиваемого объекта.
/// Визуальный элемент, отображаемый во время перетаскивания.
/// </summary>
/// <remarks>
/// <para>
/// Этот элемент отображает репрезентативное представление перетаскиваемых данных
/// и следует за курсором мыши во время операции перетаскивания.
/// </para>
/// <para>
/// Элемент поддерживает настройку прозрачности, смещения и угла поворота,
/// а также анимированное появление и скрытие.
/// </para>
/// </remarks>
public class DragAdorner : Control
{
/// <summary>
@@ -66,8 +76,11 @@ public class DragAdorner : Control
}
/// <summary>
/// Получает или задает данные перетаскивания.
/// Получает или задает данные, которые отображаются в визуальном элементе.
/// </summary>
/// <value>
/// Объект данных для отображения. Обычно это те же данные, которые перетаскиваются.
/// </value>
public object DragData
{
get => GetValue(DragDataProperty);
@@ -75,8 +88,13 @@ public class DragAdorner : Control
}
/// <summary>
/// Получает или задает смещение относительно курсора.
/// Получает или задает смещение элемента относительно позиции курсора.
/// </summary>
/// <value>
/// Смещение по осям X и Y. Используется для позиционирования элемента так,
/// чтобы он не перекрывал курсор. Значение по умолчанию вычисляется автоматически
/// на основе размера элемента.
/// </value>
public Point Offset
{
get => (Point)GetValue(OffsetProperty);
@@ -111,9 +129,13 @@ public class DragAdorner : Control
}
/// <summary>
/// Обновляет позицию элемента относительно курсора.
/// Обновляет позицию элемента в соответствии с позицией курсора.
/// </summary>
/// <param name="cursorPosition">Позиция курсора в экранных координатах.</param>
/// <param name="cursorPosition">Текущая позиция курсора в экранных координатах.</param>
/// <remarks>
/// Метод применяет трансформации для позиционирования элемента с учетом
/// заданного смещения и угла поворота.
/// </remarks>
public void UpdatePosition(Point cursorPosition)
{
var transform = new TranslateTransform

View File

@@ -7,8 +7,19 @@ using System.Linq;
namespace Lattice.UI.DragDrop.WinUI.Controls;
/// <summary>
/// Оверлей для отображения визуальных элементов перетаскивания.
/// Оверлейный слой для отображения всех визуальных элементов перетаскивания.
/// </summary>
/// <remarks>
/// <para>
/// Этот элемент добавляется поверх всего содержимого окна и содержит:
/// - Drag-визуализации (элементы, следующие за курсором)
/// - Drop-превью (подсветка областей сброса)
/// </para>
/// <para>
/// Элемент имеет <see cref="Canvas.IsHitTestVisible"/> = false, чтобы не перехватывать
/// пользовательский ввод во время операций перетаскивания.
/// </para>
/// </remarks>
public class DragDropOverlay : Canvas
{
private readonly List<UIElement> _dragVisuals = new();

View File

@@ -8,8 +8,12 @@ using Windows.UI;
namespace Lattice.UI.DragDrop.WinUI.Controls;
/// <summary>
/// Визуальный элемент для предварительного просмотра области сброса.
/// Визуальный элемент для подсветки области сброса.
/// </summary>
/// <remarks>
/// Этот элемент отображается вокруг целевого элемента при наведении перетаскиваемого
/// объекта для визуального указания возможности сброса.
/// </remarks>
[TemplateVisualState(Name = "Normal", GroupName = "CommonStates")]
[TemplateVisualState(Name = "Highlighted", GroupName = "CommonStates")]
public class DropPreviewAdorner : Control
@@ -54,8 +58,11 @@ public class DropPreviewAdorner : Control
}
/// <summary>
/// Получает или задает цвет предварительного просмотра.
/// Получает или задает цвет подсветки области сброса.
/// </summary>
/// <value>
/// Цвет границы и фона подсветки. Значение по умолчанию берется из ресурсов темы.
/// </value>
public Color PreviewColor
{
get => (Color)GetValue(PreviewColorProperty);
@@ -81,9 +88,12 @@ public class DropPreviewAdorner : Control
}
/// <summary>
/// Показывает элемент с указанными границами.
/// Показывает элемент подсветки для указанной области.
/// </summary>
/// <param name="bounds">Границы для отображения.</param>
/// <param name="bounds">Границы области для подсветки.</param>
/// <remarks>
/// Метод позиционирует элемент по указанным границам и запускает анимацию появления.
/// </remarks>
public void Show(Core.Geometry.Rect bounds)
{
Width = bounds.Width;
@@ -124,9 +134,9 @@ public class DropPreviewAdorner : Control
}
/// <summary>
/// Обновляет позицию элемента.
/// Обновляет позицию и размер элемента подсветки.
/// </summary>
/// <param name="bounds">Новые границы.</param>
/// <param name="bounds">Новые границы области для подсветки.</param>
public void UpdatePosition(Core.Geometry.Rect bounds)
{
if (RenderTransform is TranslateTransform transform)