enhance: add Layout prop for ButtonGroup

This commit is contained in:
NaBian committed 2022-01-05 21:56:30 +08:00
1 parent f44db4052d
commit 483370f218
7 files changed
+192 -86

No files matched your search

@@ -561,12 +561,18 @@
</Border>
</Grid>
</ControlTemplate>
<ItemsPanelTemplate x:Key="ButtonGroupHorizontalItemsPanelTemplate">
<ItemsPanelTemplate x:Key="ButtonGroupHorizontalUniformItemsPanelTemplate">
<UniformGrid FocusVisualStyle="{x:Null}" Rows="1" />
</ItemsPanelTemplate>
<ItemsPanelTemplate x:Key="ButtonGroupVerticalItemsPanelTemplate">
<ItemsPanelTemplate x:Key="ButtonGroupVerticalUniformItemsPanelTemplate">
<UniformGrid FocusVisualStyle="{x:Null}" Columns="1" />
</ItemsPanelTemplate>
<ItemsPanelTemplate x:Key="ButtonGroupHorizontalStackItemsPanelTemplate">
<StackPanel FocusVisualStyle="{x:Null}" Orientation="Horizontal" />
</ItemsPanelTemplate>
<ItemsPanelTemplate x:Key="ButtonGroupVerticalStackItemsPanelTemplate">
<StackPanel FocusVisualStyle="{x:Null}" />
</ItemsPanelTemplate>
<tools:ButtonGroupItemStyleSelector x:Key="ButtonGroupItemStyleSelector" />
<LinearGradientBrush x:Key="ProgressBarIndicatorAnimatedFill" StartPoint="0,0" EndPoint="1,0">
<GradientStop Color="#00FFFFFF" Offset="0" />
@@ -2442,16 +2448,35 @@
<Style x:Key="ButtonGroupBaseStyle" TargetType="hc:ButtonGroup">
<Setter Property="ItemContainerStyleSelector" Value="{StaticResource ButtonGroupItemStyleSelector}" />
<Setter Property="VerticalAlignment" Value="Top" />
<Setter Property="Layout" Value="Uniform" />
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="Focusable" Value="False" />
<Setter Property="ItemsPanel" Value="{StaticResource ButtonGroupHorizontalItemsPanelTemplate}" />
<Setter Property="ItemsPanel" Value="{StaticResource ButtonGroupHorizontalUniformItemsPanelTemplate}" />
<Setter Property="hc:VisualElement.HighlightBorderBrush" Value="{DynamicResource PrimaryBrush}" />
<Setter Property="hc:VisualElement.HighlightBackground" Value="{DynamicResource RegionBrush}" />
<Setter Property="hc:VisualElement.HighlightForeground" Value="{DynamicResource PrimaryBrush}" />
<Style.Triggers>
<Trigger Property="Orientation" Value="Vertical">
<Setter Property="ItemsPanel" Value="{StaticResource ButtonGroupVerticalItemsPanelTemplate}" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Layout" Value="Uniform" />
<Condition Property="Orientation" Value="Vertical" />
</MultiTrigger.Conditions>
<Setter Property="ItemsPanel" Value="{StaticResource ButtonGroupVerticalUniformItemsPanelTemplate}" />
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Layout" Value="Stack" />
<Condition Property="Orientation" Value="Horizontal" />
</MultiTrigger.Conditions>
<Setter Property="ItemsPanel" Value="{StaticResource ButtonGroupHorizontalStackItemsPanelTemplate}" />
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Layout" Value="Stack" />
<Condition Property="Orientation" Value="Vertical" />
</MultiTrigger.Conditions>
<Setter Property="ItemsPanel" Value="{StaticResource ButtonGroupVerticalStackItemsPanelTemplate}" />
</MultiTrigger>
</Style.Triggers>
</Style>
<Style x:Key="ProgressBarBaseStyle" TargetType="ProgressBar">
@@ -1,12 +1,14 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
using HandyControl.Data;
namespace HandyControl.Controls
{
public class ButtonGroup : ItemsControl
{
protected override bool IsItemItsOwnContainerOverride(object item) => item is Button || item is RadioButton || item is ToggleButton;
protected override bool IsItemItsOwnContainerOverride(object item) => item is Button or RadioButton or ToggleButton;
public static readonly DependencyProperty OrientationProperty = DependencyProperty.Register(
"Orientation", typeof(Orientation), typeof(ButtonGroup), new PropertyMetadata(default(Orientation)));
@@ -17,10 +19,17 @@ namespace HandyControl.Controls
set => SetValue(OrientationProperty, value);
}
protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved)
{
base.OnVisualChildrenChanged(visualAdded, visualRemoved);
public static readonly DependencyProperty LayoutProperty = DependencyProperty.Register(
"Layout", typeof(LinearLayout), typeof(ButtonGroup), new PropertyMetadata(LinearLayout.Uniform));
public LinearLayout Layout
{
get => (LinearLayout) GetValue(LayoutProperty);
set => SetValue(LayoutProperty, value);
}
protected override void OnRender(DrawingContext drawingContext)
{
var count = Items.Count;
for (var i = 0; i < count; i++)
{
@@ -0,0 +1,9 @@
namespace HandyControl.Data
{
public enum LinearLayout
{
Stack,
Uniform
}
}
@@ -85,6 +85,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Controls\Tag\TagContainer.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Controls\Text\HighlightTextBlock.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Controls\Text\SimpleText.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Data\Enum\LinearLayout.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Tools\Helper\FullScreenHelper.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Controls\Window\GlowWindow.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Data\EnumItem.cs" />
@@ -3,30 +3,57 @@
xmlns:hc="clr-namespace:HandyControl.Controls"
xmlns:tools="clr-namespace:HandyControl.Tools">
<ItemsPanelTemplate x:Key="ButtonGroupHorizontalItemsPanelTemplate">
<ItemsPanelTemplate x:Key="ButtonGroupHorizontalUniformItemsPanelTemplate">
<UniformGrid FocusVisualStyle="{x:Null}" Rows="1"/>
</ItemsPanelTemplate>
<ItemsPanelTemplate x:Key="ButtonGroupVerticalItemsPanelTemplate">
<ItemsPanelTemplate x:Key="ButtonGroupVerticalUniformItemsPanelTemplate">
<UniformGrid FocusVisualStyle="{x:Null}" Columns="1"/>
</ItemsPanelTemplate>
<ItemsPanelTemplate x:Key="ButtonGroupHorizontalStackItemsPanelTemplate">
<StackPanel FocusVisualStyle="{x:Null}" Orientation="Horizontal"/>
</ItemsPanelTemplate>
<ItemsPanelTemplate x:Key="ButtonGroupVerticalStackItemsPanelTemplate">
<StackPanel FocusVisualStyle="{x:Null}"/>
</ItemsPanelTemplate>
<tools:ButtonGroupItemStyleSelector x:Key="ButtonGroupItemStyleSelector"/>
<Style x:Key="ButtonGroupBaseStyle" TargetType="hc:ButtonGroup">
<Setter Property="ItemContainerStyleSelector" Value="{StaticResource ButtonGroupItemStyleSelector}"/>
<Setter Property="VerticalAlignment" Value="Top"/>
<Setter Property="Layout" Value="Uniform"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="Focusable" Value="False"/>
<Setter Property="ItemsPanel" Value="{StaticResource ButtonGroupHorizontalItemsPanelTemplate}"/>
<Setter Property="ItemsPanel" Value="{StaticResource ButtonGroupHorizontalUniformItemsPanelTemplate}"/>
<Setter Property="hc:VisualElement.HighlightBorderBrush" Value="{DynamicResource PrimaryBrush}"/>
<Setter Property="hc:VisualElement.HighlightBackground" Value="{DynamicResource RegionBrush}"/>
<Setter Property="hc:VisualElement.HighlightForeground" Value="{DynamicResource PrimaryBrush}"/>
<Style.Triggers>
<Trigger Property="Orientation" Value="Vertical">
<Setter Property="ItemsPanel" Value="{StaticResource ButtonGroupVerticalItemsPanelTemplate}"/>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Layout" Value="Uniform"/>
<Condition Property="Orientation" Value="Vertical"/>
</MultiTrigger.Conditions>
<Setter Property="ItemsPanel" Value="{StaticResource ButtonGroupVerticalUniformItemsPanelTemplate}"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Layout" Value="Stack"/>
<Condition Property="Orientation" Value="Horizontal"/>
</MultiTrigger.Conditions>
<Setter Property="ItemsPanel" Value="{StaticResource ButtonGroupHorizontalStackItemsPanelTemplate}"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Layout" Value="Stack"/>
<Condition Property="Orientation" Value="Vertical"/>
</MultiTrigger.Conditions>
<Setter Property="ItemsPanel" Value="{StaticResource ButtonGroupVerticalStackItemsPanelTemplate}"/>
</MultiTrigger>
</Style.Triggers>
</Style>
</ResourceDictionary>
</ResourceDictionary>
@@ -561,12 +561,18 @@
</Border>
</Grid>
</ControlTemplate>
<ItemsPanelTemplate x:Key="ButtonGroupHorizontalItemsPanelTemplate">
<ItemsPanelTemplate x:Key="ButtonGroupHorizontalUniformItemsPanelTemplate">
<UniformGrid FocusVisualStyle="{x:Null}" Rows="1" />
</ItemsPanelTemplate>
<ItemsPanelTemplate x:Key="ButtonGroupVerticalItemsPanelTemplate">
<ItemsPanelTemplate x:Key="ButtonGroupVerticalUniformItemsPanelTemplate">
<UniformGrid FocusVisualStyle="{x:Null}" Columns="1" />
</ItemsPanelTemplate>
<ItemsPanelTemplate x:Key="ButtonGroupHorizontalStackItemsPanelTemplate">
<StackPanel FocusVisualStyle="{x:Null}" Orientation="Horizontal" />
</ItemsPanelTemplate>
<ItemsPanelTemplate x:Key="ButtonGroupVerticalStackItemsPanelTemplate">
<StackPanel FocusVisualStyle="{x:Null}" />
</ItemsPanelTemplate>
<tools:ButtonGroupItemStyleSelector x:Key="ButtonGroupItemStyleSelector" />
<LinearGradientBrush x:Key="ProgressBarIndicatorAnimatedFill" StartPoint="0,0" EndPoint="1,0">
<GradientStop Color="#00FFFFFF" Offset="0" />
@@ -2442,16 +2448,35 @@
<Style x:Key="ButtonGroupBaseStyle" TargetType="hc:ButtonGroup">
<Setter Property="ItemContainerStyleSelector" Value="{StaticResource ButtonGroupItemStyleSelector}" />
<Setter Property="VerticalAlignment" Value="Top" />
<Setter Property="Layout" Value="Uniform" />
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="Focusable" Value="False" />
<Setter Property="ItemsPanel" Value="{StaticResource ButtonGroupHorizontalItemsPanelTemplate}" />
<Setter Property="ItemsPanel" Value="{StaticResource ButtonGroupHorizontalUniformItemsPanelTemplate}" />
<Setter Property="hc:VisualElement.HighlightBorderBrush" Value="{DynamicResource PrimaryBrush}" />
<Setter Property="hc:VisualElement.HighlightBackground" Value="{DynamicResource RegionBrush}" />
<Setter Property="hc:VisualElement.HighlightForeground" Value="{DynamicResource PrimaryBrush}" />
<Style.Triggers>
<Trigger Property="Orientation" Value="Vertical">
<Setter Property="ItemsPanel" Value="{StaticResource ButtonGroupVerticalItemsPanelTemplate}" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Layout" Value="Uniform" />
<Condition Property="Orientation" Value="Vertical" />
</MultiTrigger.Conditions>
<Setter Property="ItemsPanel" Value="{StaticResource ButtonGroupVerticalUniformItemsPanelTemplate}" />
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Layout" Value="Stack" />
<Condition Property="Orientation" Value="Horizontal" />
</MultiTrigger.Conditions>
<Setter Property="ItemsPanel" Value="{StaticResource ButtonGroupHorizontalStackItemsPanelTemplate}" />
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Layout" Value="Stack" />
<Condition Property="Orientation" Value="Vertical" />
</MultiTrigger.Conditions>
<Setter Property="ItemsPanel" Value="{StaticResource ButtonGroupVerticalStackItemsPanelTemplate}" />
</MultiTrigger>
</Style.Triggers>
</Style>
<Style x:Key="ProgressBarBaseStyle" TargetType="ProgressBar">
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
@@ -37,76 +38,85 @@ namespace HandyControl.Tools
{
if (container is ButtonGroup buttonGroup && item is ButtonBase buttonBase)
{
var count = buttonGroup.Items.Count;
var count = GetVisibleButtonsCount(buttonGroup);
switch (buttonBase)
{
case RadioButton:
{
if (count == 1)
{
return StyleDict[ResourceToken.RadioGroupItemSingle];
}
var index = buttonGroup.Items.IndexOf(buttonBase);
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];
}
case Button:
{
if (count == 1)
{
return StyleDict[ResourceToken.ButtonGroupItemSingle];
}
var index = buttonGroup.Items.IndexOf(buttonBase);
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];
}
case ToggleButton:
{
if (count == 1)
{
return StyleDict[ResourceToken.ToggleButtonGroupItemSingle];
}
var index = buttonGroup.Items.IndexOf(buttonBase);
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];
}
case RadioButton: return GetRadioButtonStyle(count, buttonGroup, buttonBase);
case Button: return GetButtonStyle(count, buttonGroup, buttonBase);
case ToggleButton: return GetToggleButtonStyle(count, buttonGroup, buttonBase);
}
}
return null;
}
private static int GetVisibleButtonsCount(ButtonGroup buttonGroup)
{
return buttonGroup.Items.OfType<ButtonBase>().Count(button => button.IsVisible);
}
private static Style GetToggleButtonStyle(int count, ButtonGroup buttonGroup, ButtonBase button)
{
if (count == 1)
{
return StyleDict[ResourceToken.ToggleButtonGroupItemSingle];
}
var index = buttonGroup.Items.IndexOf(button);
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, ButtonBase button)
{
if (count == 1)
{
return StyleDict[ResourceToken.ButtonGroupItemSingle];
}
var index = buttonGroup.Items.IndexOf(button);
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, ButtonBase button)
{
if (count == 1)
{
return StyleDict[ResourceToken.RadioGroupItemSingle];
}
var index = buttonGroup.Items.IndexOf(button);
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];
}
}
}