RibbonTab.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. using System.Windows;
  2. using System.Windows.Controls;
  3. using System.Windows.Controls.Primitives;
  4. using HandyControl.Data;
  5. using HandyControl.Tools.Extension;
  6. namespace HandyControl.Controls
  7. {
  8. [TemplatePart(Name = RootContainer, Type = typeof(UIElement))]
  9. public class RibbonTab : HeaderedItemsControl
  10. {
  11. private const string RootContainer = "PART_RootContainer";
  12. private UIElement _rootContainer;
  13. public Ribbon Ribbon => Ribbon.GetRibbon(this);
  14. internal RibbonTabHeader RibbonTabHeader
  15. {
  16. get
  17. {
  18. var ribbon = Ribbon;
  19. if (ribbon == null)
  20. {
  21. return null;
  22. }
  23. var index = ribbon.ItemContainerGenerator.IndexFromContainer(this);
  24. if (index < 0)
  25. {
  26. return null;
  27. }
  28. var headerItemsControl = ribbon.RibbonTabHeaderItemsControl;
  29. return headerItemsControl?.ItemContainerGenerator.ContainerFromIndex(index) as RibbonTabHeader;
  30. }
  31. }
  32. static RibbonTab()
  33. {
  34. VisibilityProperty.OverrideMetadata(typeof(RibbonTab), new PropertyMetadata(Visibility.Visible, OnVisibilityChanged));
  35. }
  36. public static readonly DependencyProperty IsSelectedProperty =
  37. Selector.IsSelectedProperty.AddOwner(typeof(RibbonTab),
  38. new FrameworkPropertyMetadata(ValueBoxes.FalseBox,
  39. FrameworkPropertyMetadataOptions.AffectsParentMeasure |
  40. FrameworkPropertyMetadataOptions.BindsTwoWayByDefault |
  41. FrameworkPropertyMetadataOptions.Journal,
  42. OnIsSelectedChanged));
  43. private static void OnIsSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  44. {
  45. var ribbonTab = (RibbonTab) d;
  46. if (ribbonTab.IsSelected)
  47. {
  48. if (ribbonTab.Ribbon.IsDropDownOpen)
  49. {
  50. ribbonTab.SwitchContentVisibility(true);
  51. }
  52. ribbonTab.OnSelected(new RoutedEventArgs(Selector.SelectedEvent, ribbonTab));
  53. }
  54. else
  55. {
  56. ribbonTab.SwitchContentVisibility(false);
  57. ribbonTab.OnUnselected(new RoutedEventArgs(Selector.UnselectedEvent, ribbonTab));
  58. }
  59. ribbonTab.RibbonTabHeader?.CoerceValue(RibbonTabHeader.IsSelectedProperty);
  60. }
  61. public bool IsSelected
  62. {
  63. get => (bool) GetValue(IsSelectedProperty);
  64. set => SetValue(IsSelectedProperty, value);
  65. }
  66. public override void OnApplyTemplate()
  67. {
  68. base.OnApplyTemplate();
  69. _rootContainer = GetTemplateChild(RootContainer) as UIElement;
  70. SwitchContentVisibility(IsSelected);
  71. }
  72. internal void SwitchContentVisibility(bool isVisible) => _rootContainer?.Show(isVisible);
  73. protected virtual void OnSelected(RoutedEventArgs e) => RaiseEvent(e);
  74. protected virtual void OnUnselected(RoutedEventArgs e) => RaiseEvent(e);
  75. protected override void OnHeaderChanged(object oldHeader, object newHeader)
  76. {
  77. base.OnHeaderChanged(oldHeader, newHeader);
  78. Ribbon?.NotifyTabHeaderChanged();
  79. }
  80. protected override DependencyObject GetContainerForItemOverride() => new RibbonGroup();
  81. protected override bool IsItemItsOwnContainerOverride(object item) => item is RibbonGroup;
  82. private static void OnVisibilityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  83. {
  84. var ribbonTab = (RibbonTab) d;
  85. ribbonTab.RibbonTabHeader?.CoerceValue(VisibilityProperty);
  86. var ribbon = ribbonTab.Ribbon;
  87. if (ribbon == null ||
  88. !ribbonTab.IsSelected ||
  89. (Visibility) e.OldValue != Visibility.Visible ||
  90. (Visibility) e.NewValue == Visibility.Visible)
  91. {
  92. return;
  93. }
  94. ribbon.ResetSelection();
  95. }
  96. }
  97. }