DragAndDrop core
This commit is contained in:
118
Lattice.Layout.UI.WinUI/Helpers/LayoutHostExtensions.cs
Normal file
118
Lattice.Layout.UI.WinUI/Helpers/LayoutHostExtensions.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user