using Lattice.Core.DragDrop.Models; using Lattice.Core.Geometry; using Lattice.UI.DragDrop.Abstractions; using Lattice.UI.DragDrop.WinUI.Controls; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using System; namespace Lattice.UI.DragDrop.WinUI.Services; /// /// Поставщик визуального представления для WinUI. /// public class WinUIDragVisualProvider : IDragVisualProvider { private readonly ResourceDictionary _resources; private DragAdorner? _currentAdorner; /// /// Инициализирует новый экземпляр класса . /// /// Ресурсы для стилей. public WinUIDragVisualProvider(ResourceDictionary resources) { _resources = resources ?? throw new ArgumentNullException(nameof(resources)); } /// public object CreateDragVisual(DragInfo dragInfo, Point initialPosition) { // Создаем новый DragAdorner _currentAdorner = new DragAdorner { DragData = dragInfo.Data, OpacityLevel = 0.8 }; // Применяем стиль из ресурсов, если есть if (_resources.ContainsKey("DragAdornerStyle")) { _currentAdorner.Style = _resources["DragAdornerStyle"] as Style; } // Настраиваем начальную позицию _currentAdorner.UpdatePosition(initialPosition); _currentAdorner.Show(); return _currentAdorner; } /// public void UpdateDragVisualPosition(object dragVisual, Point position) { if (dragVisual is DragAdorner adorner) { adorner.UpdatePosition(position); } } /// public void ReleaseDragVisual(object dragVisual) { if (dragVisual is DragAdorner adorner) { adorner.Hide(); // Отложенное удаление после анимации var timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(150) }; timer.Tick += (s, e) => { timer.Stop(); if (adorner.Parent is Panel panel) { panel.Children.Remove(adorner); } }; timer.Start(); } _currentAdorner = null; } }