using Lattice.Core.Docking.Models; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using System.Collections.ObjectModel; namespace Lattice.UI; /// /// Представляет расширенный контрол вкладок с поддержкой всех позиций размещения панели вкладок. /// Обеспечивает отображение коллекции вкладок с возможностью навигации, закрытия и изменения порядка. /// Поддерживает четыре позиции размещения: сверху, снизу, слева и справа. /// public sealed class AdvancedTabControl : Control { private Grid? _rootGrid; private TabView? _tabView; /// /// Инициализирует новый экземпляр класса . /// public AdvancedTabControl() { DefaultStyleKey = typeof(AdvancedTabControl); } /// /// Идентифицирует свойство зависимостей . /// public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register(nameof(ItemsSource), typeof(ObservableCollection), typeof(AdvancedTabControl), new PropertyMetadata(null)); /// /// Идентифицирует свойство зависимостей . /// public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register(nameof(SelectedItem), typeof(object), typeof(AdvancedTabControl), new PropertyMetadata(null)); /// /// Идентифицирует свойство зависимостей . /// public static readonly DependencyProperty TabPlacementProperty = DependencyProperty.Register(nameof(TabPlacement), typeof(TabPlacement), typeof(AdvancedTabControl), new PropertyMetadata(TabPlacement.Top, OnTabPlacementChanged)); /// /// Получает или задает источник данных для вкладок. /// public ObservableCollection ItemsSource { get => (ObservableCollection)GetValue(ItemsSourceProperty); set => SetValue(ItemsSourceProperty, value); } /// /// Получает или задает выбранный элемент вкладки. /// public object SelectedItem { get => GetValue(SelectedItemProperty); set => SetValue(SelectedItemProperty, value); } /// /// Получает или задает положение панели вкладок. /// public TabPlacement TabPlacement { get => (TabPlacement)GetValue(TabPlacementProperty); set => SetValue(TabPlacementProperty, value); } /// /// Вызывается при применении шаблона контрола. /// protected override void OnApplyTemplate() { base.OnApplyTemplate(); _rootGrid = GetTemplateChild("PART_RootGrid") as Grid; _tabView = GetTemplateChild("PART_TabView") as TabView; UpdateTabPlacement(); } /// /// Обновляет положение панели вкладок в соответствии с текущим значением свойства . /// private void UpdateTabPlacement() { if (_rootGrid == null) return; // Очищаем определения строк и столбцов _rootGrid.RowDefinitions.Clear(); _rootGrid.ColumnDefinitions.Clear(); switch (TabPlacement) { case TabPlacement.Top: SetupTopPlacement(); break; case TabPlacement.Bottom: SetupBottomPlacement(); break; case TabPlacement.Left: SetupLeftPlacement(); break; case TabPlacement.Right: SetupRightPlacement(); break; } } /// /// Настраивает размещение панели вкладок вверху. /// private void SetupTopPlacement() { _rootGrid!.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto }); _rootGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) }); if (_tabView != null) { Grid.SetRow(_tabView, 0); Grid.SetColumn(_tabView, 0); Grid.SetRowSpan(_tabView, 1); } } /// /// Настраивает размещение панели вкладок внизу. /// private void SetupBottomPlacement() { _rootGrid!.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) }); _rootGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto }); if (_tabView != null) { Grid.SetRow(_tabView, 1); Grid.SetColumn(_tabView, 0); } } /// /// Настраивает размещение панели вкладок слева. /// private void SetupLeftPlacement() { _rootGrid!.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); _rootGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); if (_tabView != null) { // Для вертикального размещения требуется специальный стиль _tabView.Style = Application.Current.Resources["VerticalTabViewStyle"] as Style; Grid.SetRow(_tabView, 0); Grid.SetColumn(_tabView, 0); } } /// /// Настраивает размещение панели вкладок справа. /// private void SetupRightPlacement() { _rootGrid!.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); _rootGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); if (_tabView != null) { _tabView.Style = Application.Current.Resources["VerticalTabViewStyle"] as Style; Grid.SetRow(_tabView, 0); Grid.SetColumn(_tabView, 1); } } /// /// Обрабатывает изменение значения свойства . /// /// Объект зависимости, значение которого изменилось. /// Данные о изменении свойства. private static void OnTabPlacementChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is AdvancedTabControl control) control.UpdateTabPlacement(); } }