RibbonTabHeader.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System.Windows;
  2. using System.Windows.Controls;
  3. using System.Windows.Input;
  4. using HandyControl.Data;
  5. namespace HandyControl.Controls
  6. {
  7. public class RibbonTabHeader : ContentControl
  8. {
  9. public Ribbon Ribbon => Ribbon.GetRibbon(this);
  10. internal RibbonTab RibbonTab
  11. {
  12. get
  13. {
  14. var itemsControl = ItemsControl.ItemsControlFromItemContainer(this);
  15. var ribbon = Ribbon;
  16. if (itemsControl == null || ribbon == null)
  17. {
  18. return null;
  19. }
  20. var index = itemsControl.ItemContainerGenerator.IndexFromContainer(this);
  21. return ribbon.ItemContainerGenerator.ContainerFromIndex(index) as RibbonTab;
  22. }
  23. }
  24. static RibbonTabHeader()
  25. {
  26. VisibilityProperty.OverrideMetadata(typeof(RibbonTabHeader), new FrameworkPropertyMetadata(null, CoerceVisibility));
  27. }
  28. public static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register(
  29. nameof(IsSelected), typeof(bool), typeof(RibbonTabHeader),
  30. new PropertyMetadata(ValueBoxes.FalseBox, OnIsSelectedChanged, CoerceIsSelected));
  31. private static void OnIsSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  32. {
  33. ((RibbonTabHeader) d).OnIsSelectedChanged((bool) e.OldValue, (bool) e.NewValue);
  34. }
  35. public bool IsSelected
  36. {
  37. get => (bool) GetValue(IsSelectedProperty);
  38. set => SetValue(IsSelectedProperty, value);
  39. }
  40. internal void PrepareRibbonTabHeader()
  41. {
  42. CoerceValue(IsSelectedProperty);
  43. CoerceValue(VisibilityProperty);
  44. }
  45. protected virtual void OnIsSelectedChanged(bool oldIsSelected, bool newIsSelected)
  46. {
  47. }
  48. protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
  49. {
  50. var ribbon = Ribbon;
  51. if (ribbon != null)
  52. {
  53. ribbon.NotifyMouseClickedOnTabHeader(this, e);
  54. e.Handled = true;
  55. }
  56. base.OnMouseLeftButtonDown(e);
  57. }
  58. protected override void OnGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
  59. {
  60. base.OnGotKeyboardFocus(e);
  61. var ribbonTab = RibbonTab;
  62. if (ribbonTab == null)
  63. {
  64. return;
  65. }
  66. ribbonTab.IsSelected = true;
  67. }
  68. private static object CoerceIsSelected(DependencyObject d, object basevalue)
  69. {
  70. var ribbonTab = ((RibbonTabHeader) d).RibbonTab;
  71. return ribbonTab != null ? ValueBoxes.BooleanBox(ribbonTab.IsSelected) : basevalue;
  72. }
  73. private static object CoerceVisibility(DependencyObject d, object basevalue)
  74. {
  75. var ribbonTab = ((RibbonTabHeader) d).RibbonTab;
  76. return ribbonTab != null ? ValueBoxes.VisibilityBox(ribbonTab.Visibility) : basevalue;
  77. }
  78. }
  79. }