using Lattice.Themes;
using Lattice.Themes.Core.Tokens;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
namespace Lattice.UI.DragDrop.WinUI.Extensions;
///
/// Методы расширения для работы с темами в DragDrop.
///
public static class ThemeExtensions
{
///
/// Применяет стиль перетаскивания, основанный на токенах темы.
///
public static void ApplyLatticeDragStyle(this Control control)
{
var style = Application.Current.Resources["Lattice.DragDrop.DragSourceStyle"] as Style;
if (style != null)
{
control.Style = style;
}
else
{
// Fallback на старый стиль
control.ApplyDragStyle();
}
}
///
/// Применяет стиль цели сброса, основанный на токенах темы.
///
public static void ApplyLatticeDropTargetStyle(this Control control)
{
var style = Application.Current.Resources["Lattice.DragDrop.DropTargetStyle"] as Style;
if (style != null)
{
control.Style = style;
}
else
{
// Fallback на старый стиль
control.ApplyDropTargetStyle();
}
}
///
/// Переключает визуальное состояние элемента с использованием токенов темы.
///
public static void SetLatticeDragVisualState(this Control control, string stateName, bool useTransitions = true)
{
try
{
VisualStateManager.GoToState(control, stateName, useTransitions);
}
catch
{
// Fallback на альтернативные методы с использованием токенов
var themeManager = ThemeManager.Current;
switch (stateName)
{
case "Dragging":
control.Opacity = themeManager.GetTokenValue(LatticeTokens.OpacityDrag) ?? 0.7;
control.RenderTransform = new Microsoft.UI.Xaml.Media.ScaleTransform
{
ScaleX = 0.95,
ScaleY = 0.95
};
break;
case "DragOver":
var dragOverBrush = themeManager.GetTokenValue(
LatticeTokens.BrushDragOverlay);
control.Background = dragOverBrush ??
Application.Current.Resources["Lattice.DragDrop.DragOverBackgroundBrush"] as Microsoft.UI.Xaml.Media.Brush;
break;
case "Normal":
control.ClearValue(Control.OpacityProperty);
control.ClearValue(Control.RenderTransformProperty);
control.ClearValue(Control.BackgroundProperty);
control.ClearValue(Control.BorderBrushProperty);
break;
}
}
}
///
/// Получает значение токена для использования в DragDrop.
///
public static T? GetDragDropToken(this Control control, string tokenKey) where T : class
{
var themeManager = ThemeManager.Current;
return themeManager.GetTokenValue(tokenKey);
}
///
/// Создает DragAdorner с использованием токенов темы.
///
public static Controls.DragAdorner CreateLatticeDragAdorner(object dragData)
{
return new Controls.DragAdorner
{
DragData = dragData,
Style = Application.Current.Resources["Lattice.DragDrop.DragSourceStyle"] as Style
};
}
///
/// Создает DropPreviewAdorner с использованием токенов темы.
///
public static Controls.DropPreviewAdorner CreateLatticeDropPreviewAdorner()
{
return new Controls.DropPreviewAdorner
{
Style = Application.Current.Resources[typeof(Controls.DropPreviewAdorner)] as Style
};
}
}