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();
}
}