119 lines
5.4 KiB
C#
119 lines
5.4 KiB
C#
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();
|
||
}
|
||
}
|