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;
}
}