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