Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 33 additions & 3 deletions src/Shared/HandyControl_Shared/Controls/Button/ButtonGroup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,43 @@ public LinearLayout Layout
set => SetValue(LayoutProperty, value);
}

protected override void OnRender(DrawingContext drawingContext)
protected override void OnRender(DrawingContext drawingContext)
{
var count = Items.Count;
for (var i = 0; i < count; i++)
{
var item = (ButtonBase) Items[i];
item.Style = ItemContainerStyleSelector?.SelectStyle(item, this);
if (this.GetButtonBaseByIndex(i) is ButtonBase buttonBase)
{
buttonBase.Style = ItemContainerStyleSelector?.SelectStyle(Items[i], this);
}
}
}

}

public static class ButtonGroupExtensions
{
public static ButtonBase GetButtonBaseByIndex(this ButtonGroup buttonGroup, int index)
{
return GetButtonBaseByItem(buttonGroup, buttonGroup.Items[index]);
}

public static ButtonBase GetButtonBaseByItem(this ButtonGroup buttonGroup, object item)
{
if (item is ButtonBase buttonBase)
{
return buttonBase;
}
var container = buttonGroup.ItemContainerGenerator.ContainerFromItem(item);

if (container is ButtonBase buttonBase2)
{
return buttonBase2;
}
else if (container != null && VisualTreeHelper.GetChildrenCount(container) > 0 && VisualTreeHelper.GetChild(container, 0) is ButtonBase buttonBase3)
{
return buttonBase3;
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,17 +34,17 @@ public class ButtonGroupItemStyleSelector : StyleSelector
[ResourceToken.ToggleButtonGroupItemDefault] = ResourceHelper.GetResourceInternal<Style>(ResourceToken.ToggleButtonGroupItemDefault)
};

public override Style SelectStyle(object item, DependencyObject container)
public override Style SelectStyle(object item, DependencyObject container)
{
if (container is ButtonGroup buttonGroup && item is ButtonBase buttonBase)
if (container is ButtonGroup buttonGroup && buttonGroup.GetButtonBaseByItem(item) is ButtonBase buttonBase)
{
var count = GetVisibleButtonsCount(buttonGroup);

switch (buttonBase)
{
case RadioButton: return GetRadioButtonStyle(count, buttonGroup, buttonBase);
case Button: return GetButtonStyle(count, buttonGroup, buttonBase);
case ToggleButton: return GetToggleButtonStyle(count, buttonGroup, buttonBase);
case RadioButton: return GetRadioButtonStyle(count, buttonGroup, item);
case Button: return GetButtonStyle(count, buttonGroup, item);
case ToggleButton: return GetToggleButtonStyle(count, buttonGroup, item);
}
}

Expand All @@ -53,17 +53,25 @@ public override Style SelectStyle(object item, DependencyObject container)

private static int GetVisibleButtonsCount(ButtonGroup buttonGroup)
{
return buttonGroup.Items.OfType<ButtonBase>().Count(button => button.IsVisible);
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, ButtonBase button)
private static Style GetToggleButtonStyle(int count, ButtonGroup buttonGroup, object buttonItem)
{
if (count == 1)
{
return StyleDict[ResourceToken.ToggleButtonGroupItemSingle];
}

var index = buttonGroup.Items.IndexOf(button);
var index = buttonGroup.Items.IndexOf(buttonItem);
return buttonGroup.Orientation == Orientation.Horizontal
? index == 0
? StyleDict[ResourceToken.ToggleButtonGroupItemHorizontalFirst]
Expand All @@ -77,14 +85,14 @@ private static Style GetToggleButtonStyle(int count, ButtonGroup buttonGroup, Bu
: ResourceToken.ToggleButtonGroupItemDefault];
}

private static Style GetButtonStyle(int count, ButtonGroup buttonGroup, ButtonBase button)
private static Style GetButtonStyle(int count, ButtonGroup buttonGroup, object buttonItem)
{
if (count == 1)
{
return StyleDict[ResourceToken.ButtonGroupItemSingle];
}

var index = buttonGroup.Items.IndexOf(button);
var index = buttonGroup.Items.IndexOf(buttonItem);
return buttonGroup.Orientation == Orientation.Horizontal
? index == 0
? StyleDict[ResourceToken.ButtonGroupItemHorizontalFirst]
Expand All @@ -98,14 +106,14 @@ private static Style GetButtonStyle(int count, ButtonGroup buttonGroup, ButtonBa
: ResourceToken.ButtonGroupItemDefault];
}

private static Style GetRadioButtonStyle(int count, ButtonGroup buttonGroup, ButtonBase button)
private static Style GetRadioButtonStyle(int count, ButtonGroup buttonGroup, object buttonItem)
{
if (count == 1)
{
return StyleDict[ResourceToken.RadioGroupItemSingle];
}

var index = buttonGroup.Items.IndexOf(button);
var index = buttonGroup.Items.IndexOf(buttonItem);
return buttonGroup.Orientation == Orientation.Horizontal
? index == 0
? StyleDict[ResourceToken.RadioGroupItemHorizontalFirst]
Expand Down