using Lattice.Layout.Abstractions; using Lattice.Layout.UI.WinUI.Controls; using Lattice.Layout.UI.WinUI.Docking; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using System.Collections.Generic; using System.Linq; namespace Lattice.Layout.UI.WinUI.Visuals; /// /// Визуальное представление группы вкладок для WinUI. /// Управляет и вкладками . /// public sealed class WinUIGroupVisual : LayoutVisual, IWinUIVisual { /// /// Реальный WinUI-контрол группы вкладок. /// public WinUIGroupControl GroupControl { get; } /// /// Контрол, используемый докингом и рендерером. /// public FrameworkElement Control => GroupControl; /// /// Визуальные элементы вкладок. /// public IReadOnlyList Items { get; } public WinUIGroupVisual(ILayoutGroup model, IReadOnlyList items) : base(model) { Items = items; GroupControl = new WinUIGroupControl(); } /// public override void Attach() { // Полная очистка GroupControl.TabView.TabItems.Clear(); foreach (var visual in Items) { visual.Attach(); if (visual is WinUIItemVisual itemVisual) { var tab = new TabViewItem { Header = itemVisual.Header, Content = itemVisual.Control // безопасно, т.к. Control — UserControl }; GroupControl.TabView.TabItems.Add(tab); } } // Активная вкладка по модели if (Model is ILayoutGroup group && group.ActiveItem is not null) { var index = group.Items is IList list ? list.IndexOf(group.ActiveItem) : group.Items.ToList().IndexOf(group.ActiveItem); if (index >= 0 && index < GroupControl.TabView.TabItems.Count) GroupControl.TabView.SelectedIndex = index; } } /// public override void Detach() { foreach (var visual in Items) visual.Detach(); GroupControl.TabView.TabItems.Clear(); } }