DragAndDrop core

This commit is contained in:
FrigaT
2026-01-18 16:33:35 +03:00
parent 9ea82af329
commit 79bdd8bc62
229 changed files with 21214 additions and 2494 deletions

View File

@@ -0,0 +1,118 @@
using Lattice.Layout.Abstractions;
using Lattice.Layout.UI.WinUI.Controls;
using Microsoft.UI.Xaml;
using System;
namespace Lattice.Layout.UI.WinUI;
/// <summary>
/// Набор вспомогательных методов для упрощённой работы с визуальным хостом раскладки.
/// Позволяет быстро подключать LayoutManager, обновлять UI и связывать содержимое.
/// </summary>
public static class LayoutHostExtensions
{
// ------------------------------------------------------------------------
// 1. Подключение LayoutManager к любому ILayoutView
// ------------------------------------------------------------------------
/// <summary>
/// Подписывает визуальный хост на события изменения раскладки.
/// При каждом изменении модели вызывается <see cref="ILayoutView.Refresh"/>.
/// </summary>
/// <param name="view">Визуальный хост раскладки.</param>
/// <param name="manager">Менеджер раскладки.</param>
public static void BindToManager(this ILayoutView view, ILayoutManager manager)
{
manager.LayoutChanged += (_, _) => view.Refresh();
}
// ------------------------------------------------------------------------
// 2. Полная инициализация раскладки (Root + Manager)
// ------------------------------------------------------------------------
/// <summary>
/// Устанавливает корневой элемент раскладки, подключает менеджер и выполняет начальную отрисовку.
/// </summary>
/// <param name="view">Визуальный хост раскладки.</param>
/// <param name="root">Корневой элемент раскладки.</param>
/// <param name="manager">Менеджер раскладки.</param>
public static void UseLayout(this ILayoutView view, ILayoutRoot root, ILayoutManager manager)
{
view.Root = root;
view.BindToManager(manager);
view.Refresh();
}
// ------------------------------------------------------------------------
// 3. Удобный fluent-API
// ------------------------------------------------------------------------
/// <summary>
/// Устанавливает корневой элемент раскладки и возвращает хост для fluent-цепочек.
/// </summary>
public static T WithRoot<T>(this T view, ILayoutRoot root)
where T : ILayoutView
{
view.Root = root;
return view;
}
/// <summary>
/// Подключает менеджер раскладки и возвращает хост для fluent-цепочек.
/// </summary>
public static T WithManager<T>(this T view, ILayoutManager manager)
where T : ILayoutView
{
view.BindToManager(manager);
return view;
}
/// <summary>
/// Выполняет начальную отрисовку и возвращает хост для fluent-цепочек.
/// </summary>
public static T Initialize<T>(this T view)
where T : ILayoutView
{
view.Refresh();
return view;
}
// ------------------------------------------------------------------------
// 4. Поддержка WinUILayoutHost: резолвер контента
// ------------------------------------------------------------------------
/// <summary>
/// Устанавливает функцию, которая по ContentId возвращает реальный UI-элемент.
/// Используется для отображения содержимого вкладок.
/// </summary>
/// <param name="host">WinUI-хост раскладки.</param>
/// <param name="resolver">Функция, возвращающая UIElement по ContentId.</param>
public static void UseContentResolver(this WinUILayoutHost host, Func<string, UIElement> resolver)
{
host.ContentResolver = resolver;
}
// ------------------------------------------------------------------------
// 5. Полная WinUI-инициализация (Root + Manager + ContentResolver)
// ------------------------------------------------------------------------
/// <summary>
/// Полностью инициализирует WinUI-хост раскладки:
/// устанавливает корень, подключает менеджер, задаёт резолвер содержимого и выполняет отрисовку.
/// </summary>
/// <param name="host">WinUI-хост раскладки.</param>
/// <param name="root">Корневой элемент раскладки.</param>
/// <param name="manager">Менеджер раскладки.</param>
/// <param name="resolver">Функция получения UI-содержимого по ContentId.</param>
public static void UseLayout(
this WinUILayoutHost host,
ILayoutRoot root,
ILayoutManager manager,
Func<string, UIElement> resolver)
{
host.Root = root;
host.BindToManager(manager);
host.ContentResolver = resolver;
host.Refresh();
}
}