diff --git a/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Styles/SliderDemo.axaml b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Styles/SliderDemo.axaml new file mode 100644 index 000000000..1ce718e01 --- /dev/null +++ b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Styles/SliderDemo.axaml @@ -0,0 +1,90 @@ +<UserControl xmlns="https://github.com/avaloniaui" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + x:Class="HandyControlDemo.UserControl.SliderDemo" + xmlns:hc="https://handyorg.github.io/handycontrol" + Background="{DynamicResource RegionBrush}"> + <ScrollViewer> + <hc:UniformSpacingPanel Margin="32" + Orientation="Horizontal" + Spacing="32" + ClipToBounds="False" + ChildWrapping="Wrap"> + <hc:UniformSpacingPanel Orientation="Vertical" + Spacing="32"> + <Slider Width="400" + IsSnapToTickEnabled="True" + TickFrequency="1" + Maximum="10" + Value="8" /> + <Slider Width="400" + IsSnapToTickEnabled="True" + TickFrequency="1" + Maximum="10" + Value="3" + IsEnabled="False" /> + <Slider Width="400" + IsSnapToTickEnabled="True" + TickFrequency="5" + Maximum="100" + TickPlacement="TopLeft" + Value="10" /> + <Slider Width="400" + hc:TipElement.IsVisible="True" + hc:TipElement.Placement="Top" + IsSnapToTickEnabled="True" + Maximum="100" + Value="60" + TickFrequency="10" + TickPlacement="BottomRight" /> + <Slider Width="400" + hc:TipElement.IsVisible="True" + hc:TipElement.Placement="Bottom" + hc:TipElement.StringFormat="N2" + TickFrequency="1" + Maximum="10" + Value="5" + TickPlacement="Outside" /> + </hc:UniformSpacingPanel> + <hc:UniformSpacingPanel Spacing="32"> + <Slider Height="400" + IsSnapToTickEnabled="True" + TickFrequency="1" + Maximum="10" + Value="8" + Orientation="Vertical" /> + <Slider Height="400" + IsSnapToTickEnabled="True" + TickFrequency="1" + Maximum="10" + Value="3" + IsEnabled="False" + Orientation="Vertical" /> + <Slider Height="400" + IsSnapToTickEnabled="True" + TickFrequency="5" + Maximum="100" + TickPlacement="TopLeft" + Value="10" + Orientation="Vertical" /> + <Slider Height="400" + hc:TipElement.IsVisible="True" + hc:TipElement.Placement="Right" + IsSnapToTickEnabled="True" + Maximum="100" + Value="60" + TickFrequency="10" + TickPlacement="BottomRight" + Orientation="Vertical" /> + <Slider Height="400" + hc:TipElement.IsVisible="True" + hc:TipElement.Placement="Left" + hc:TipElement.StringFormat="N2" + TickFrequency="1" + Maximum="10" + Value="5" + TickPlacement="Outside" + Orientation="Vertical" /> + </hc:UniformSpacingPanel> + </hc:UniformSpacingPanel> + </ScrollViewer> +</UserControl> diff --git a/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Styles/SliderDemo.axaml.cs b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Styles/SliderDemo.axaml.cs new file mode 100644 index 000000000..8483efa21 --- /dev/null +++ b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Styles/SliderDemo.axaml.cs @@ -0,0 +1,9 @@ +namespace HandyControlDemo.UserControl; + +public partial class SliderDemo : Avalonia.Controls.UserControl +{ + public SliderDemo() + { + InitializeComponent(); + } +} diff --git a/src/Avalonia/HandyControl_Avalonia/Controls/Attach/ContentControlAttach.cs b/src/Avalonia/HandyControl_Avalonia/Controls/Attach/ContentControlAttach.cs new file mode 100644 index 000000000..6bdbbe919 --- /dev/null +++ b/src/Avalonia/HandyControl_Avalonia/Controls/Attach/ContentControlAttach.cs @@ -0,0 +1,49 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Data; + +namespace HandyControl.Controls; + +public class ContentControlAttach +{ + public static readonly AttachedProperty<string> ContentStringFormatProperty = + AvaloniaProperty.RegisterAttached<ContentControlAttach, AvaloniaObject, string>("ContentStringFormat"); + + public static void SetContentStringFormat(AvaloniaObject element, string value) => + element.SetValue(ContentStringFormatProperty, value); + + public static string GetContentStringFormat(AvaloniaObject element) => + element.GetValue(ContentStringFormatProperty); + + public static readonly AttachedProperty<object?> ContentProperty = + AvaloniaProperty.RegisterAttached<ContentControlAttach, AvaloniaObject, object?>("Content"); + + public static void SetContent(AvaloniaObject element, object? value) => element.SetValue(ContentProperty, value); + + public static object? GetContent(AvaloniaObject element) => element.GetValue(ContentProperty); + + static ContentControlAttach() + { + ContentStringFormatProperty.Changed.AddClassHandler<AvaloniaObject>(OnContentChanged); + ContentProperty.Changed.AddClassHandler<AvaloniaObject>(OnContentChanged); + } + + private static void OnContentChanged(AvaloniaObject element, AvaloniaPropertyChangedEventArgs e) + { + if (element is not ContentControl contentControl) + { + return; + } + + contentControl.ClearValue(ContentControl.ContentProperty); + + var binding = new Binding("(ContentControlAttach.Content)") + { + Source = contentControl, + StringFormat = contentControl.GetValue(ContentStringFormatProperty), + TypeResolver = (_, _) => typeof(ContentControlAttach) + }; + + contentControl.Bind(ContentControl.ContentProperty, binding); + } +} diff --git a/src/Avalonia/HandyControl_Avalonia/Controls/Attach/TipElement.cs b/src/Avalonia/HandyControl_Avalonia/Controls/Attach/TipElement.cs new file mode 100644 index 000000000..3ad3622b0 --- /dev/null +++ b/src/Avalonia/HandyControl_Avalonia/Controls/Attach/TipElement.cs @@ -0,0 +1,30 @@ +using Avalonia; +using HandyControl.Data; + +namespace HandyControl.Controls; + +public class TipElement +{ + public static readonly AttachedProperty<bool> IsVisibleProperty = + AvaloniaProperty.RegisterAttached<TipElement, AvaloniaObject, bool>("IsVisible"); + + public static void SetIsVisible(AvaloniaObject element, bool value) => element.SetValue(IsVisibleProperty, value); + + public static bool GetIsVisible(AvaloniaObject element) => element.GetValue(IsVisibleProperty); + + public static readonly AttachedProperty<PlacementType> PlacementProperty = + AvaloniaProperty.RegisterAttached<TipElement, AvaloniaObject, PlacementType>("Placement"); + + public static void SetPlacement(AvaloniaObject element, PlacementType value) => + element.SetValue(PlacementProperty, value); + + public static PlacementType GetPlacement(AvaloniaObject element) => element.GetValue(PlacementProperty); + + public static readonly AttachedProperty<string> StringFormatProperty = + AvaloniaProperty.RegisterAttached<TipElement, AvaloniaObject, string>("StringFormat", defaultValue: "N1"); + + public static void SetStringFormat(AvaloniaObject element, string value) => + element.SetValue(StringFormatProperty, value); + + public static string GetStringFormat(AvaloniaObject element) => element.GetValue(StringFormatProperty); +} diff --git a/src/Avalonia/HandyControl_Avalonia/Controls/Panel/AxleCanvas.cs b/src/Avalonia/HandyControl_Avalonia/Controls/Panel/AxleCanvas.cs new file mode 100644 index 000000000..95ad21984 --- /dev/null +++ b/src/Avalonia/HandyControl_Avalonia/Controls/Panel/AxleCanvas.cs @@ -0,0 +1,73 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Layout; + +namespace HandyControl.Controls; + +public class AxleCanvas : Canvas +{ + public static readonly StyledProperty<Orientation> OrientationProperty = + StackPanel.OrientationProperty.AddOwner<AxleCanvas>(new StyledPropertyMetadata<Orientation>( + defaultValue: Orientation.Horizontal)); + + public Orientation Orientation + { + get => GetValue(OrientationProperty); + set => SetValue(OrientationProperty, value); + } + + protected override Size ArrangeOverride(Size finalSize) + { + foreach (Control? internalChild in Children) + { + if (internalChild == null) + { + continue; + } + + double x = 0.0; + double y = 0.0; + + if (Orientation == Orientation.Horizontal) + { + x = (finalSize.Width - internalChild.DesiredSize.Width) / 2; + + double top = GetTop(internalChild); + if (!double.IsNaN(top)) + { + y = top; + } + else + { + double bottom = GetBottom(internalChild); + if (!double.IsNaN(bottom)) + { + y = finalSize.Height - internalChild.DesiredSize.Height - bottom; + } + } + } + else + { + y = (finalSize.Height - internalChild.DesiredSize.Height) / 2; + + double left = GetLeft(internalChild); + if (!double.IsNaN(left)) + { + x = left; + } + else + { + double right = GetRight(internalChild); + if (!double.IsNaN(right)) + { + x = finalSize.Width - internalChild.DesiredSize.Width - right; + } + } + } + + internalChild.Arrange(new Rect(new Point(x, y), internalChild.DesiredSize)); + } + + return finalSize; + } +} diff --git a/src/Avalonia/HandyControl_Avalonia/Data/Enum/PlacementType.cs b/src/Avalonia/HandyControl_Avalonia/Data/Enum/PlacementType.cs new file mode 100644 index 000000000..8c66ef8e6 --- /dev/null +++ b/src/Avalonia/HandyControl_Avalonia/Data/Enum/PlacementType.cs @@ -0,0 +1,17 @@ +namespace HandyControl.Data; + +public enum PlacementType +{ + LeftTop, + Left, + LeftBottom, + TopLeft, + Top, + TopRight, + RightTop, + Right, + RightBottom, + BottomLeft, + Bottom, + BottomRight, +} diff --git a/src/Avalonia/HandyControl_Avalonia/Themes/Basic/Effects.axaml b/src/Avalonia/HandyControl_Avalonia/Themes/Basic/Effects.axaml index 9af2a1116..0685f0a6b 100644 --- a/src/Avalonia/HandyControl_Avalonia/Themes/Basic/Effects.axaml +++ b/src/Avalonia/HandyControl_Avalonia/Themes/Basic/Effects.axaml @@ -1,7 +1,7 @@ <ResourceDictionary xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> - <Color x:Key="EffectShadowColor">#88000000</Color> + <Color x:Key="EffectShadowColor">Black</Color> <DropShadowEffect x:Key="EffectShadow1" BlurRadius="5" diff --git a/src/Avalonia/HandyControl_Avalonia/Themes/Styles/Slider.axaml b/src/Avalonia/HandyControl_Avalonia/Themes/Styles/Slider.axaml new file mode 100644 index 000000000..f0ccc1917 --- /dev/null +++ b/src/Avalonia/HandyControl_Avalonia/Themes/Styles/Slider.axaml @@ -0,0 +1,449 @@ +<ResourceDictionary xmlns="https://github.com/avaloniaui" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:hc="clr-namespace:HandyControl.Controls"> + <ControlTheme x:Key="SliderRepeatButtonStyle" + TargetType="RepeatButton"> + <Setter Property="Background" + Value="Transparent" /> + <Setter Property="Focusable" + Value="False" /> + <Setter Property="Template"> + <ControlTemplate> + <Border Background="{TemplateBinding Background}" /> + </ControlTemplate> + </Setter> + </ControlTheme> + + <ControlTheme x:Key="SliderThumb" + TargetType="Thumb"> + <Setter Property="Height" + Value="18" /> + <Setter Property="Width" + Value="18" /> + <Setter Property="ClipToBounds" + Value="False" /> + <Setter Property="Template"> + <ControlTemplate> + <hc:AxleCanvas> + <Ellipse Width="18" + Height="18" + Fill="White" + Effect="{StaticResource EffectShadow1}" + StrokeThickness="0" + Stroke="{DynamicResource PrimaryBrush}"> + <Ellipse.Transitions> + <Transitions> + <DoubleTransition Property="StrokeThickness" + Duration="0:0:0.1" /> + </Transitions> + </Ellipse.Transitions> + </Ellipse> + </hc:AxleCanvas> + </ControlTemplate> + </Setter> + + <Style Selector="^:pointerover"> + <Style Selector="^ /template/ Ellipse"> + <Setter Property="Effect" + Value="{StaticResource EffectShadow2}" /> + </Style> + </Style> + + <Style Selector="^:pressed /template/ Ellipse"> + <Setter Property="StrokeThickness" + Value="2" /> + </Style> + </ControlTheme> + + <ControlTheme x:Key="TipSliderThumbHorizontalTop" + TargetType="Thumb"> + <Setter Property="Height" + Value="18" /> + <Setter Property="Width" + Value="18" /> + <Setter Property="ClipToBounds" + Value="False" /> + <Setter Property="Template"> + <ControlTemplate> + <hc:AxleCanvas> + <Label Name="LabelValue" + IsHitTestVisible="False" + IsVisible="False" + Canvas.Bottom="28" + Theme="{StaticResource LabelPrimary}" + hc:ContentControlAttach.Content="{Binding Value,RelativeSource={RelativeSource AncestorType=Slider}}" + hc:ContentControlAttach.ContentStringFormat="{Binding Path=(hc:TipElement.StringFormat),RelativeSource={RelativeSource AncestorType=Slider}}" /> + <Ellipse Width="18" + Height="18" + Fill="White" + Effect="{StaticResource EffectShadow1}" + StrokeThickness="0" + Stroke="{DynamicResource PrimaryBrush}"> + <Ellipse.Transitions> + <Transitions> + <DoubleTransition Property="StrokeThickness" + Duration="0:0:0.1" /> + </Transitions> + </Ellipse.Transitions> + </Ellipse> + </hc:AxleCanvas> + </ControlTemplate> + </Setter> + + <Style Selector="^:pointerover"> + <Style Selector="^ /template/ Ellipse"> + <Setter Property="Effect" + Value="{StaticResource EffectShadow2}" /> + </Style> + <Style Selector="^ /template/ Label#LabelValue"> + <Setter Property="IsVisible" + Value="True" /> + </Style> + </Style> + + <Style Selector="^:pressed /template/ Ellipse"> + <Setter Property="StrokeThickness" + Value="2" /> + </Style> + </ControlTheme> + + <ControlTheme x:Key="TipSliderThumbHorizontalBottom" + TargetType="Thumb"> + <Setter Property="Height" + Value="18" /> + <Setter Property="Width" + Value="18" /> + <Setter Property="ClipToBounds" + Value="False" /> + <Setter Property="Template"> + <ControlTemplate> + <hc:AxleCanvas> + <Label Name="LabelValue" + IsHitTestVisible="False" + IsVisible="False" + Canvas.Top="28" + Theme="{StaticResource LabelPrimary}" + hc:ContentControlAttach.Content="{Binding Value,RelativeSource={RelativeSource AncestorType=Slider}}" + hc:ContentControlAttach.ContentStringFormat="{Binding Path=(hc:TipElement.StringFormat),RelativeSource={RelativeSource AncestorType=Slider}}" /> + <Ellipse Width="18" + Height="18" + Fill="White" + Effect="{StaticResource EffectShadow1}" + StrokeThickness="0" + Stroke="{DynamicResource PrimaryBrush}"> + <Ellipse.Transitions> + <Transitions> + <DoubleTransition Property="StrokeThickness" + Duration="0:0:0.1" /> + </Transitions> + </Ellipse.Transitions> + </Ellipse> + </hc:AxleCanvas> + </ControlTemplate> + </Setter> + + <Style Selector="^:pointerover"> + <Style Selector="^ /template/ Ellipse"> + <Setter Property="Effect" + Value="{StaticResource EffectShadow2}" /> + </Style> + <Style Selector="^ /template/ Label#LabelValue"> + <Setter Property="IsVisible" + Value="True" /> + </Style> + </Style> + + <Style Selector="^:pressed /template/ Ellipse"> + <Setter Property="StrokeThickness" + Value="2" /> + </Style> + </ControlTheme> + + <ControlTheme x:Key="TipSliderThumbVerticalLeft" + TargetType="Thumb"> + <Setter Property="Height" + Value="18" /> + <Setter Property="Width" + Value="18" /> + <Setter Property="ClipToBounds" + Value="False" /> + <Setter Property="Template"> + <ControlTemplate> + <hc:AxleCanvas Orientation="Vertical"> + <Label Name="LabelValue" + IsHitTestVisible="False" + IsVisible="False" + Canvas.Right="28" + Theme="{StaticResource LabelPrimary}" + hc:ContentControlAttach.Content="{Binding Value,RelativeSource={RelativeSource AncestorType=Slider}}" + hc:ContentControlAttach.ContentStringFormat="{Binding Path=(hc:TipElement.StringFormat),RelativeSource={RelativeSource AncestorType=Slider}}" /> + <Ellipse Width="18" + Height="18" + Fill="White" + Effect="{StaticResource EffectShadow1}" + StrokeThickness="0" + Stroke="{DynamicResource PrimaryBrush}"> + <Ellipse.Transitions> + <Transitions> + <DoubleTransition Property="StrokeThickness" + Duration="0:0:0.1" /> + </Transitions> + </Ellipse.Transitions> + </Ellipse> + </hc:AxleCanvas> + </ControlTemplate> + </Setter> + + <Style Selector="^:pointerover"> + <Style Selector="^ /template/ Ellipse"> + <Setter Property="Effect" + Value="{StaticResource EffectShadow2}" /> + </Style> + <Style Selector="^ /template/ Label#LabelValue"> + <Setter Property="IsVisible" + Value="True" /> + </Style> + </Style> + + <Style Selector="^:pressed /template/ Ellipse"> + <Setter Property="StrokeThickness" + Value="2" /> + </Style> + </ControlTheme> + + <ControlTheme x:Key="TipSliderThumbVerticalRight" + TargetType="Thumb"> + <Setter Property="Height" + Value="18" /> + <Setter Property="Width" + Value="18" /> + <Setter Property="ClipToBounds" + Value="False" /> + <Setter Property="Template"> + <ControlTemplate> + <hc:AxleCanvas Orientation="Vertical"> + <Label Name="LabelValue" + IsHitTestVisible="False" + IsVisible="False" + Canvas.Left="28" + Theme="{StaticResource LabelPrimary}" + hc:ContentControlAttach.Content="{Binding Value,RelativeSource={RelativeSource AncestorType=Slider}}" + hc:ContentControlAttach.ContentStringFormat="{Binding Path=(hc:TipElement.StringFormat),RelativeSource={RelativeSource AncestorType=Slider}}" /> + <Ellipse Width="18" + Height="18" + Fill="White" + Effect="{StaticResource EffectShadow1}" + StrokeThickness="0" + Stroke="{DynamicResource PrimaryBrush}"> + <Ellipse.Transitions> + <Transitions> + <DoubleTransition Property="StrokeThickness" + Duration="0:0:0.1" /> + </Transitions> + </Ellipse.Transitions> + </Ellipse> + </hc:AxleCanvas> + </ControlTemplate> + </Setter> + + <Style Selector="^:pointerover"> + <Style Selector="^ /template/ Ellipse"> + <Setter Property="Effect" + Value="{StaticResource EffectShadow2}" /> + </Style> + <Style Selector="^ /template/ Label#LabelValue"> + <Setter Property="IsVisible" + Value="True" /> + </Style> + </Style> + + <Style Selector="^:pressed /template/ Ellipse"> + <Setter Property="StrokeThickness" + Value="2" /> + </Style> + </ControlTheme> + + <ControlTheme x:Key="{x:Type Slider}" + TargetType="Slider"> + <Setter Property="Background" + Value="{DynamicResource SecondaryRegionBrush}" /> + <Setter Property="BorderBrush" + Value="{DynamicResource BorderBrush}" /> + <Setter Property="Foreground" + Value="{DynamicResource DarkPrimaryBrush}" /> + <Setter Property="ClipToBounds" + Value="False" /> + + <Style Selector="^:horizontal"> + <Setter Property="Template"> + <ControlTemplate> + <Grid x:Name="rootGrid" + Margin="9,0" + RenderOptions.RequiresFullOpacityHandling="True"> + <Grid.RowDefinitions> + <RowDefinition Height="Auto" /> + <RowDefinition Height="Auto" + MinHeight="{TemplateBinding MinHeight}" /> + <RowDefinition Height="Auto" /> + </Grid.RowDefinitions> + <TickBar x:Name="TopTickBar" + Fill="{TemplateBinding Foreground}" + Ticks="{TemplateBinding Ticks}" + TickFrequency="{TemplateBinding TickFrequency}" + Minimum="{TemplateBinding Slider.Minimum}" + Maximum="{TemplateBinding Slider.Maximum}" + Height="4" + Margin="0,0,0,2" + Placement="Top" + Grid.Row="0" + IsVisible="False" /> + <TickBar x:Name="BottomTickBar" + Fill="{TemplateBinding Foreground}" + Ticks="{TemplateBinding Ticks}" + TickFrequency="{TemplateBinding TickFrequency}" + Minimum="{TemplateBinding Slider.Minimum}" + Maximum="{TemplateBinding Slider.Maximum}" + Height="4" + Margin="0,2,0,0" + Placement="Bottom" + Grid.Row="2" + IsVisible="False" /> + <Border Grid.Row="1" + Height="2" + Background="{TemplateBinding Background}" + VerticalAlignment="Center" /> + <Track Name="PART_Track" + Grid.Row="1" + Minimum="{TemplateBinding Minimum}" + Maximum="{TemplateBinding Maximum}" + Value="{TemplateBinding Value}" + IsDirectionReversed="{TemplateBinding IsDirectionReversed}" + Orientation="Horizontal"> + <Track.DecreaseButton> + <RepeatButton Name="PART_DecreaseButton" + Background="{DynamicResource PrimaryBrush}" + Theme="{StaticResource SliderRepeatButtonStyle}" + Height="2" /> + </Track.DecreaseButton> + <Track.IncreaseButton> + <RepeatButton Name="PART_IncreaseButton" + Theme="{StaticResource SliderRepeatButtonStyle}" + Height="2" /> + </Track.IncreaseButton> + <Thumb Margin="-9,0" + Theme="{StaticResource SliderThumb}" /> + </Track> + </Grid> + </ControlTemplate> + </Setter> + </Style> + + <Style Selector="^:vertical"> + <Setter Property="Template"> + <ControlTemplate> + <Grid x:Name="rootGrid" + Margin="0,9" + RenderOptions.RequiresFullOpacityHandling="True"> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="Auto" /> + <ColumnDefinition MinWidth="{TemplateBinding MinWidth}" + Width="Auto" /> + <ColumnDefinition Width="Auto" /> + </Grid.ColumnDefinitions> + <TickBar x:Name="LeftTickBar" + Grid.Column="0" + Fill="{TemplateBinding Foreground}" + Ticks="{TemplateBinding Ticks}" + TickFrequency="{TemplateBinding TickFrequency}" + Minimum="{TemplateBinding Slider.Minimum}" + Maximum="{TemplateBinding Slider.Maximum}" + Margin="0,0,2,0" + Placement="Left" + IsVisible="False" + Width="4" /> + <TickBar x:Name="RightTickBar" + Grid.Column="2" + Fill="{TemplateBinding Foreground}" + Ticks="{TemplateBinding Ticks}" + TickFrequency="{TemplateBinding TickFrequency}" + Minimum="{TemplateBinding Slider.Minimum}" + Maximum="{TemplateBinding Slider.Maximum}" + Margin="2,0,0,0" + Placement="Right" + IsVisible="False" + Width="4" /> + <Border Grid.Column="1" + Width="2" + Background="{TemplateBinding Background}" + HorizontalAlignment="Center" /> + <Track Name="PART_Track" + Grid.Column="1" + Minimum="{TemplateBinding Minimum}" + Maximum="{TemplateBinding Maximum}" + Value="{TemplateBinding Value}" + IsDirectionReversed="{TemplateBinding IsDirectionReversed}" + Orientation="Vertical"> + <Track.DecreaseButton> + <RepeatButton Name="PART_DecreaseButton" + Background="{DynamicResource PrimaryBrush}" + Theme="{StaticResource SliderRepeatButtonStyle}" + Width="2" /> + </Track.DecreaseButton> + <Track.IncreaseButton> + <RepeatButton Name="PART_IncreaseButton" + Theme="{StaticResource SliderRepeatButtonStyle}" + Width="2" /> + </Track.IncreaseButton> + <Thumb Margin="0,-9" + Theme="{StaticResource SliderThumb}" /> + </Track> + </Grid> + </ControlTemplate> + </Setter> + </Style> + + <Style Selector="^[TickPlacement=TopLeft] /template/ TickBar#LeftTickBar, ^[TickPlacement=Outside] /template/ TickBar#LeftTickBar"> + <Setter Property="IsVisible" + Value="True" /> + </Style> + + <Style Selector="^[TickPlacement=TopLeft] /template/ TickBar#TopTickBar, ^[TickPlacement=Outside] /template/ TickBar#TopTickBar"> + <Setter Property="IsVisible" + Value="True" /> + </Style> + + <Style Selector="^[TickPlacement=BottomRight] /template/ TickBar#BottomTickBar, ^[TickPlacement=Outside] /template/ TickBar#BottomTickBar"> + <Setter Property="IsVisible" + Value="True" /> + </Style> + + <Style Selector="^[TickPlacement=BottomRight] /template/ TickBar#RightTickBar, ^[TickPlacement=Outside] /template/ TickBar#RightTickBar"> + <Setter Property="IsVisible" + Value="True" /> + </Style> + + <Style Selector="^[(hc|TipElement.IsVisible)=True]"> + <Style Selector="^[(hc|TipElement.Placement)=Top] /template/ Thumb"> + <Setter Property="Theme" + Value="{StaticResource TipSliderThumbHorizontalTop}" /> + </Style> + <Style Selector="^[(hc|TipElement.Placement)=Bottom] /template/ Thumb"> + <Setter Property="Theme" + Value="{StaticResource TipSliderThumbHorizontalBottom}" /> + </Style> + <Style Selector="^[(hc|TipElement.Placement)=Left] /template/ Thumb"> + <Setter Property="Theme" + Value="{StaticResource TipSliderThumbVerticalLeft}" /> + </Style> + <Style Selector="^[(hc|TipElement.Placement)=Right] /template/ Thumb"> + <Setter Property="Theme" + Value="{StaticResource TipSliderThumbVerticalRight}" /> + </Style> + </Style> + + <Style Selector="^:disabled /template/ Grid#rootGrid"> + <Setter Property="Opacity" + Value="0.2" /> + </Style> + </ControlTheme> +</ResourceDictionary> diff --git a/src/Avalonia/HandyControl_Avalonia/Themes/Styles/Style.axaml b/src/Avalonia/HandyControl_Avalonia/Themes/Styles/Style.axaml index c4579693b..ee6af5b5a 100644 --- a/src/Avalonia/HandyControl_Avalonia/Themes/Styles/Style.axaml +++ b/src/Avalonia/HandyControl_Avalonia/Themes/Styles/Style.axaml @@ -26,6 +26,7 @@ <MergeResourceInclude Source="avares://HandyControl/Themes/Styles/ScrollViewer.axaml" /> <MergeResourceInclude Source="avares://HandyControl/Themes/Styles/ListBox.axaml" /> <MergeResourceInclude Source="avares://HandyControl/Themes/Styles/Label.axaml" /> + <MergeResourceInclude Source="avares://HandyControl/Themes/Styles/Slider.axaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Styles.Resources> diff --git a/src/Avalonia/HandyControl_Avalonia/Themes/Styles/ToggleButton.axaml b/src/Avalonia/HandyControl_Avalonia/Themes/Styles/ToggleButton.axaml index 8b4a014f8..44730a492 100644 --- a/src/Avalonia/HandyControl_Avalonia/Themes/Styles/ToggleButton.axaml +++ b/src/Avalonia/HandyControl_Avalonia/Themes/Styles/ToggleButton.axaml @@ -505,11 +505,13 @@ Value="6,0,0,0" /> <Setter Property="Height" Value="24" /> + <Setter Property="ClipToBounds" + Value="False" /> <Setter Property="Template"> <ControlTemplate> <Grid Background="Transparent" ColumnDefinitions="Auto, *"> - <Viewbox> + <Viewbox ClipToBounds="False"> <Panel Width="80" Height="48"> <Border BorderBrush="{TemplateBinding BorderBrush}" @@ -575,6 +577,7 @@ IsVisible="{Binding $self.Content, Converter={x:Static ObjectConverters.IsNotNull}}" Grid.Column="1" Focusable="False" + ClipToBounds="True" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True"