123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Controls.Primitives;
- using HandyControl.Data;
- using HandyControl.Tools.Extension;
- namespace HandyControl.Controls
- {
- [TemplatePart(Name = RootContainer, Type = typeof(UIElement))]
- public class RibbonTab : HeaderedItemsControl
- {
- private const string RootContainer = "PART_RootContainer";
- private UIElement _rootContainer;
- public Ribbon Ribbon => Ribbon.GetRibbon(this);
- internal RibbonTabHeader RibbonTabHeader
- {
- get
- {
- var ribbon = Ribbon;
- if (ribbon == null)
- {
- return null;
- }
- var index = ribbon.ItemContainerGenerator.IndexFromContainer(this);
- if (index < 0)
- {
- return null;
- }
- var headerItemsControl = ribbon.RibbonTabHeaderItemsControl;
- return headerItemsControl?.ItemContainerGenerator.ContainerFromIndex(index) as RibbonTabHeader;
- }
- }
- static RibbonTab()
- {
- VisibilityProperty.OverrideMetadata(typeof(RibbonTab), new PropertyMetadata(Visibility.Visible, OnVisibilityChanged));
- }
- public static readonly DependencyProperty IsSelectedProperty =
- Selector.IsSelectedProperty.AddOwner(typeof(RibbonTab),
- new FrameworkPropertyMetadata(ValueBoxes.FalseBox,
- FrameworkPropertyMetadataOptions.AffectsParentMeasure |
- FrameworkPropertyMetadataOptions.BindsTwoWayByDefault |
- FrameworkPropertyMetadataOptions.Journal,
- OnIsSelectedChanged));
- private static void OnIsSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
- {
- var ribbonTab = (RibbonTab) d;
- if (ribbonTab.IsSelected)
- {
- if (ribbonTab.Ribbon.IsDropDownOpen)
- {
- ribbonTab.SwitchContentVisibility(true);
- }
- ribbonTab.OnSelected(new RoutedEventArgs(Selector.SelectedEvent, ribbonTab));
- }
- else
- {
- ribbonTab.SwitchContentVisibility(false);
- ribbonTab.OnUnselected(new RoutedEventArgs(Selector.UnselectedEvent, ribbonTab));
- }
- ribbonTab.RibbonTabHeader?.CoerceValue(RibbonTabHeader.IsSelectedProperty);
- }
- public bool IsSelected
- {
- get => (bool) GetValue(IsSelectedProperty);
- set => SetValue(IsSelectedProperty, value);
- }
- public override void OnApplyTemplate()
- {
- base.OnApplyTemplate();
- _rootContainer = GetTemplateChild(RootContainer) as UIElement;
- SwitchContentVisibility(IsSelected);
- }
- internal void SwitchContentVisibility(bool isVisible) => _rootContainer?.Show(isVisible);
- protected virtual void OnSelected(RoutedEventArgs e) => RaiseEvent(e);
- protected virtual void OnUnselected(RoutedEventArgs e) => RaiseEvent(e);
- protected override void OnHeaderChanged(object oldHeader, object newHeader)
- {
- base.OnHeaderChanged(oldHeader, newHeader);
- Ribbon?.NotifyTabHeaderChanged();
- }
- protected override DependencyObject GetContainerForItemOverride() => new RibbonGroup();
- protected override bool IsItemItsOwnContainerOverride(object item) => item is RibbonGroup;
- private static void OnVisibilityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
- {
- var ribbonTab = (RibbonTab) d;
- ribbonTab.RibbonTabHeader?.CoerceValue(VisibilityProperty);
- var ribbon = ribbonTab.Ribbon;
- if (ribbon == null ||
- !ribbonTab.IsSelected ||
- (Visibility) e.OldValue != Visibility.Visible ||
- (Visibility) e.NewValue == Visibility.Visible)
- {
- return;
- }
- ribbon.ResetSelection();
- }
- }
- }
|