enhance: add Layout prop for ButtonGroup
This commit is contained in:
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">
|
||||
|
||||
+73
-63
@@ -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];
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user