-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Expand file tree
/
Copy pathButtonGroupItemStyleSelector.cs
More file actions
129 lines (115 loc) · 6.47 KB
/
ButtonGroupItemStyleSelector.cs
File metadata and controls
129 lines (115 loc) · 6.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using HandyControl.Controls;
using HandyControl.Data;
namespace HandyControl.Tools;
public class ButtonGroupItemStyleSelector : StyleSelector
{
private static readonly Dictionary<string, Style> StyleDict = new()
{
[ResourceToken.RadioGroupItemSingle] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemSingle),
[ResourceToken.RadioGroupItemHorizontalFirst] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemHorizontalFirst),
[ResourceToken.RadioGroupItemHorizontalLast] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemHorizontalLast),
[ResourceToken.RadioGroupItemVerticalFirst] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemVerticalFirst),
[ResourceToken.RadioGroupItemVerticalLast] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemVerticalLast),
[ResourceToken.RadioGroupItemDefault] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.RadioGroupItemDefault),
[ResourceToken.ButtonGroupItemSingle] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemSingle),
[ResourceToken.ButtonGroupItemHorizontalFirst] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemHorizontalFirst),
[ResourceToken.ButtonGroupItemHorizontalLast] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemHorizontalLast),
[ResourceToken.ButtonGroupItemVerticalFirst] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemVerticalFirst),
[ResourceToken.ButtonGroupItemVerticalLast] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemVerticalLast),
[ResourceToken.ButtonGroupItemDefault] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ButtonGroupItemDefault),
[ResourceToken.ToggleButtonGroupItemSingle] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemSingle),
[ResourceToken.ToggleButtonGroupItemHorizontalFirst] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemHorizontalFirst),
[ResourceToken.ToggleButtonGroupItemHorizontalLast] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemHorizontalLast),
[ResourceToken.ToggleButtonGroupItemVerticalFirst] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemVerticalFirst),
[ResourceToken.ToggleButtonGroupItemVerticalLast] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemVerticalLast),
[ResourceToken.ToggleButtonGroupItemDefault] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemDefault)
};
public override Style SelectStyle(object item, DependencyObject container)
{
if (container is ButtonGroup buttonGroup && buttonGroup.GetButtonBaseByItem(item) is ButtonBase buttonBase)
{
var count = GetVisibleButtonsCount(buttonGroup);
switch (buttonBase)
{
case RadioButton: return GetRadioButtonStyle(count, buttonGroup, item);
case Button: return GetButtonStyle(count, buttonGroup, item);
case ToggleButton: return GetToggleButtonStyle(count, buttonGroup, item);
}
}
return null;
}
private static int GetVisibleButtonsCount(ButtonGroup buttonGroup)
{
var count = 0;
foreach (var button in buttonGroup.Items)
{
if (buttonGroup.GetButtonBaseByItem(button) is ButtonBase buttonBase && buttonBase.IsVisible)
{
count++;
}
}
return count;
}
private static Style GetToggleButtonStyle(int count, ButtonGroup buttonGroup, object buttonItem)
{
if (count == 1)
{
return StyleDict[ResourceToken.ToggleButtonGroupItemSingle];
}
var index = buttonGroup.Items.IndexOf(buttonItem);
return buttonGroup.Orientation == Orientation.Horizontal
? index == 0
? StyleDict[ResourceToken.ToggleButtonGroupItemHorizontalFirst]
: StyleDict[index == count - 1
? ResourceToken.ToggleButtonGroupItemHorizontalLast
: ResourceToken.ToggleButtonGroupItemDefault]
: index == 0
? StyleDict[ResourceToken.ToggleButtonGroupItemVerticalFirst]
: StyleDict[index == count - 1
? ResourceToken.ToggleButtonGroupItemVerticalLast
: ResourceToken.ToggleButtonGroupItemDefault];
}
private static Style GetButtonStyle(int count, ButtonGroup buttonGroup, object buttonItem)
{
if (count == 1)
{
return StyleDict[ResourceToken.ButtonGroupItemSingle];
}
var index = buttonGroup.Items.IndexOf(buttonItem);
return buttonGroup.Orientation == Orientation.Horizontal
? index == 0
? StyleDict[ResourceToken.ButtonGroupItemHorizontalFirst]
: StyleDict[index == count - 1
? ResourceToken.ButtonGroupItemHorizontalLast
: ResourceToken.ButtonGroupItemDefault]
: index == 0
? StyleDict[ResourceToken.ButtonGroupItemVerticalFirst]
: StyleDict[index == count - 1
? ResourceToken.ButtonGroupItemVerticalLast
: ResourceToken.ButtonGroupItemDefault];
}
private static Style GetRadioButtonStyle(int count, ButtonGroup buttonGroup, object buttonItem)
{
if (count == 1)
{
return StyleDict[ResourceToken.RadioGroupItemSingle];
}
var index = buttonGroup.Items.IndexOf(buttonItem);
return buttonGroup.Orientation == Orientation.Horizontal
? index == 0
? StyleDict[ResourceToken.RadioGroupItemHorizontalFirst]
: StyleDict[index == count - 1
? ResourceToken.RadioGroupItemHorizontalLast
: ResourceToken.RadioGroupItemDefault]
: index == 0
? StyleDict[ResourceToken.RadioGroupItemVerticalFirst]
: StyleDict[index == count - 1
? ResourceToken.RadioGroupItemVerticalLast
: ResourceToken.RadioGroupItemDefault];
}
}