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 @@ + + + + + + + + + + + + + + + + + + + + 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 ContentStringFormatProperty = + AvaloniaProperty.RegisterAttached("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 ContentProperty = + AvaloniaProperty.RegisterAttached("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(OnContentChanged); + ContentProperty.Changed.AddClassHandler(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 IsVisibleProperty = + AvaloniaProperty.RegisterAttached("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 PlacementProperty = + AvaloniaProperty.RegisterAttached("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 StringFormatProperty = + AvaloniaProperty.RegisterAttached("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 OrientationProperty = + StackPanel.OrientationProperty.AddOwner(new StyledPropertyMetadata( + 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 @@  - #88000000 + Black + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + 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" /> + - +