ButtonGroupItemStyleSelector.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Windows;
  4. using System.Windows.Controls;
  5. using System.Windows.Controls.Primitives;
  6. using HandyControl.Controls;
  7. using HandyControl.Data;
  8. namespace HandyControl.Tools;
  9. public class ButtonGroupItemStyleSelector : StyleSelector
  10. {
  11. private static readonly Dictionary<string, Style> StyleDict = new()
  12. {
  13. [ResourceToken.RadioGroupItemSingle] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemSingle),
  14. [ResourceToken.RadioGroupItemHorizontalFirst] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemHorizontalFirst),
  15. [ResourceToken.RadioGroupItemHorizontalLast] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemHorizontalLast),
  16. [ResourceToken.RadioGroupItemVerticalFirst] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemVerticalFirst),
  17. [ResourceToken.RadioGroupItemVerticalLast] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemVerticalLast),
  18. [ResourceToken.RadioGroupItemDefault] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemDefault),
  19. [ResourceToken.ButtonGroupItemSingle] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemSingle),
  20. [ResourceToken.ButtonGroupItemHorizontalFirst] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemHorizontalFirst),
  21. [ResourceToken.ButtonGroupItemHorizontalLast] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemHorizontalLast),
  22. [ResourceToken.ButtonGroupItemVerticalFirst] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemVerticalFirst),
  23. [ResourceToken.ButtonGroupItemVerticalLast] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemVerticalLast),
  24. [ResourceToken.ButtonGroupItemDefault] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemDefault),
  25. [ResourceToken.ToggleButtonGroupItemSingle] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemSingle),
  26. [ResourceToken.ToggleButtonGroupItemHorizontalFirst] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemHorizontalFirst),
  27. [ResourceToken.ToggleButtonGroupItemHorizontalLast] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemHorizontalLast),
  28. [ResourceToken.ToggleButtonGroupItemVerticalFirst] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemVerticalFirst),
  29. [ResourceToken.ToggleButtonGroupItemVerticalLast] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemVerticalLast),
  30. [ResourceToken.ToggleButtonGroupItemDefault] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemDefault)
  31. };
  32. public override Style SelectStyle(object item, DependencyObject container)
  33. {
  34. if (container is ButtonGroup buttonGroup && item is ButtonBase buttonBase)
  35. {
  36. var count = GetVisibleButtonsCount(buttonGroup);
  37. switch (buttonBase)
  38. {
  39. case RadioButton: return GetRadioButtonStyle(count, buttonGroup, buttonBase);
  40. case Button: return GetButtonStyle(count, buttonGroup, buttonBase);
  41. case ToggleButton: return GetToggleButtonStyle(count, buttonGroup, buttonBase);
  42. }
  43. }
  44. return null;
  45. }
  46. private static int GetVisibleButtonsCount(ButtonGroup buttonGroup)
  47. {
  48. return buttonGroup.Items.OfType<ButtonBase>().Count(button => button.IsVisible);
  49. }
  50. private static Style GetToggleButtonStyle(int count, ButtonGroup buttonGroup, ButtonBase button)
  51. {
  52. if (count == 1)
  53. {
  54. return StyleDict[ResourceToken.ToggleButtonGroupItemSingle];
  55. }
  56. var index = buttonGroup.Items.IndexOf(button);
  57. return buttonGroup.Orientation == Orientation.Horizontal
  58. ? index == 0
  59. ? StyleDict[ResourceToken.ToggleButtonGroupItemHorizontalFirst]
  60. : StyleDict[index == count - 1
  61. ? ResourceToken.ToggleButtonGroupItemHorizontalLast
  62. : ResourceToken.ToggleButtonGroupItemDefault]
  63. : index == 0
  64. ? StyleDict[ResourceToken.ToggleButtonGroupItemVerticalFirst]
  65. : StyleDict[index == count - 1
  66. ? ResourceToken.ToggleButtonGroupItemVerticalLast
  67. : ResourceToken.ToggleButtonGroupItemDefault];
  68. }
  69. private static Style GetButtonStyle(int count, ButtonGroup buttonGroup, ButtonBase button)
  70. {
  71. if (count == 1)
  72. {
  73. return StyleDict[ResourceToken.ButtonGroupItemSingle];
  74. }
  75. var index = buttonGroup.Items.IndexOf(button);
  76. return buttonGroup.Orientation == Orientation.Horizontal
  77. ? index == 0
  78. ? StyleDict[ResourceToken.ButtonGroupItemHorizontalFirst]
  79. : StyleDict[index == count - 1
  80. ? ResourceToken.ButtonGroupItemHorizontalLast
  81. : ResourceToken.ButtonGroupItemDefault]
  82. : index == 0
  83. ? StyleDict[ResourceToken.ButtonGroupItemVerticalFirst]
  84. : StyleDict[index == count - 1
  85. ? ResourceToken.ButtonGroupItemVerticalLast
  86. : ResourceToken.ButtonGroupItemDefault];
  87. }
  88. private static Style GetRadioButtonStyle(int count, ButtonGroup buttonGroup, ButtonBase button)
  89. {
  90. if (count == 1)
  91. {
  92. return StyleDict[ResourceToken.RadioGroupItemSingle];
  93. }
  94. var index = buttonGroup.Items.IndexOf(button);
  95. return buttonGroup.Orientation == Orientation.Horizontal
  96. ? index == 0
  97. ? StyleDict[ResourceToken.RadioGroupItemHorizontalFirst]
  98. : StyleDict[index == count - 1
  99. ? ResourceToken.RadioGroupItemHorizontalLast
  100. : ResourceToken.RadioGroupItemDefault]
  101. : index == 0
  102. ? StyleDict[ResourceToken.RadioGroupItemVerticalFirst]
  103. : StyleDict[index == count - 1
  104. ? ResourceToken.RadioGroupItemVerticalLast
  105. : ResourceToken.RadioGroupItemDefault];
  106. }
  107. }