| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- // Copyright (c) The Avalonia Project. All rights reserved.
- // Licensed under the MIT license. See licence.md file in the project root for full license information.
- using System.Linq;
- using Avalonia.Controls.Generators;
- using Avalonia.Controls.Mixins;
- using Avalonia.Controls.Presenters;
- using Avalonia.Controls.Primitives;
- using Avalonia.Controls.Templates;
- using Avalonia.Input;
- using Avalonia.Layout;
- using Avalonia.VisualTree;
- namespace Avalonia.Controls
- {
- /// <summary>
- /// A tab control that displays a tab strip along with the content of the selected tab.
- /// </summary>
- public class TabControl : SelectingItemsControl
- {
- /// <summary>
- /// Defines the <see cref="TabStripPlacement"/> property.
- /// </summary>
- public static readonly StyledProperty<Dock> TabStripPlacementProperty =
- AvaloniaProperty.Register<TabControl, Dock>(nameof(TabStripPlacement), defaultValue: Dock.Top);
- /// <summary>
- /// Defines the <see cref="HorizontalContentAlignment"/> property.
- /// </summary>
- public static readonly StyledProperty<HorizontalAlignment> HorizontalContentAlignmentProperty =
- ContentControl.HorizontalContentAlignmentProperty.AddOwner<TabControl>();
- /// <summary>
- /// Defines the <see cref="VerticalContentAlignment"/> property.
- /// </summary>
- public static readonly StyledProperty<VerticalAlignment> VerticalContentAlignmentProperty =
- ContentControl.VerticalContentAlignmentProperty.AddOwner<TabControl>();
- /// <summary>
- /// Defines the <see cref="ContentTemplate"/> property.
- /// </summary>
- public static readonly StyledProperty<IDataTemplate> ContentTemplateProperty =
- ContentControl.ContentTemplateProperty.AddOwner<TabControl>();
- /// <summary>
- /// The selected content property
- /// </summary>
- public static readonly StyledProperty<object> SelectedContentProperty =
- AvaloniaProperty.Register<TabControl, object>(nameof(SelectedContent));
- /// <summary>
- /// The selected content template property
- /// </summary>
- public static readonly StyledProperty<IDataTemplate> SelectedContentTemplateProperty =
- AvaloniaProperty.Register<TabControl, IDataTemplate>(nameof(SelectedContentTemplate));
- /// <summary>
- /// The default value for the <see cref="ItemsControl.ItemsPanel"/> property.
- /// </summary>
- private static readonly FuncTemplate<IPanel> DefaultPanel =
- new FuncTemplate<IPanel>(() => new WrapPanel());
- /// <summary>
- /// Initializes static members of the <see cref="TabControl"/> class.
- /// </summary>
- static TabControl()
- {
- SelectionModeProperty.OverrideDefaultValue<TabControl>(SelectionMode.AlwaysSelected);
- ItemsPanelProperty.OverrideDefaultValue<TabControl>(DefaultPanel);
- AffectsMeasure<TabControl>(TabStripPlacementProperty);
- ContentControlMixin.Attach<TabControl>(
- SelectedContentProperty,
- x => x.LogicalChildren,
- "PART_SelectedContentHost");
- }
- /// <summary>
- /// Gets or sets the horizontal alignment of the content within the control.
- /// </summary>
- public HorizontalAlignment HorizontalContentAlignment
- {
- get { return GetValue(HorizontalContentAlignmentProperty); }
- set { SetValue(HorizontalContentAlignmentProperty, value); }
- }
- /// <summary>
- /// Gets or sets the vertical alignment of the content within the control.
- /// </summary>
- public VerticalAlignment VerticalContentAlignment
- {
- get { return GetValue(VerticalContentAlignmentProperty); }
- set { SetValue(VerticalContentAlignmentProperty, value); }
- }
- /// <summary>
- /// Gets or sets the tabstrip placement of the TabControl.
- /// </summary>
- public Dock TabStripPlacement
- {
- get { return GetValue(TabStripPlacementProperty); }
- set { SetValue(TabStripPlacementProperty, value); }
- }
- /// <summary>
- /// Gets or sets the default data template used to display the content of the selected tab.
- /// </summary>
- public IDataTemplate ContentTemplate
- {
- get { return GetValue(ContentTemplateProperty); }
- set { SetValue(ContentTemplateProperty, value); }
- }
- /// <summary>
- /// Gets or sets the content of the selected tab.
- /// </summary>
- /// <value>
- /// The content of the selected tab.
- /// </value>
- public object SelectedContent
- {
- get { return GetValue(SelectedContentProperty); }
- internal set { SetValue(SelectedContentProperty, value); }
- }
- /// <summary>
- /// Gets or sets the content template for the selected tab.
- /// </summary>
- /// <value>
- /// The content template of the selected tab.
- /// </value>
- public IDataTemplate SelectedContentTemplate
- {
- get { return GetValue(SelectedContentTemplateProperty); }
- internal set { SetValue(SelectedContentTemplateProperty, value); }
- }
- internal ItemsPresenter ItemsPresenterPart { get; private set; }
- internal ContentPresenter ContentPart { get; private set; }
- protected override IItemContainerGenerator CreateItemContainerGenerator()
- {
- return new TabItemContainerGenerator(this);
- }
- protected override void OnTemplateApplied(TemplateAppliedEventArgs e)
- {
- base.OnTemplateApplied(e);
- ItemsPresenterPart = e.NameScope.Get<ItemsPresenter>("PART_ItemsPresenter");
- ContentPart = e.NameScope.Get<ContentPresenter>("PART_SelectedContentHost");
- }
- /// <inheritdoc/>
- protected override void OnGotFocus(GotFocusEventArgs e)
- {
- base.OnGotFocus(e);
- if (e.NavigationMethod == NavigationMethod.Directional)
- {
- e.Handled = UpdateSelectionFromEventSource(e.Source);
- }
- }
- /// <inheritdoc/>
- protected override void OnPointerPressed(PointerPressedEventArgs e)
- {
- base.OnPointerPressed(e);
- if (e.MouseButton == MouseButton.Left && e.Pointer.Type == PointerType.Mouse)
- {
- e.Handled = UpdateSelectionFromEventSource(e.Source);
- }
- }
- protected override void OnPointerReleased(PointerReleasedEventArgs e)
- {
- if (e.MouseButton == MouseButton.Left && e.Pointer.Type != PointerType.Mouse)
- {
- var container = GetContainerFromEventSource(e.Source);
- if (container != null
- && container.GetVisualsAt(e.GetPosition(container))
- .Any(c => container == c || container.IsVisualAncestorOf(c)))
- {
- e.Handled = UpdateSelectionFromEventSource(e.Source);
- }
- }
- }
- }
- }
|