From 3b3368be93eb05efab0496f068d44097f741be72 Mon Sep 17 00:00:00 2001 From: rabbitism Date: Thu, 15 Feb 2024 12:33:26 +0800 Subject: [PATCH] feat: add adorner flavor usage. --- .../Pages/DisableContainerDemo.axaml | 29 ++++++---- .../DisableContainer.cs | 0 .../DisableContainer/DisabledAdorner.cs | 55 +++++++++++++++++++ 3 files changed, 74 insertions(+), 10 deletions(-) rename src/Ursa/Controls/{ => DisableContainer}/DisableContainer.cs (100%) create mode 100644 src/Ursa/Controls/DisableContainer/DisabledAdorner.cs diff --git a/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml b/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml index 80f5848..c355b01 100644 --- a/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml +++ b/demo/Ursa.Demo/Pages/DisableContainerDemo.axaml @@ -1,20 +1,29 @@ - + - + - + - + + diff --git a/src/Ursa/Controls/DisableContainer.cs b/src/Ursa/Controls/DisableContainer/DisableContainer.cs similarity index 100% rename from src/Ursa/Controls/DisableContainer.cs rename to src/Ursa/Controls/DisableContainer/DisableContainer.cs diff --git a/src/Ursa/Controls/DisableContainer/DisabledAdorner.cs b/src/Ursa/Controls/DisableContainer/DisabledAdorner.cs new file mode 100644 index 0000000..3699b3a --- /dev/null +++ b/src/Ursa/Controls/DisableContainer/DisabledAdorner.cs @@ -0,0 +1,55 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Controls.Primitives; +using Avalonia.Data; +using Avalonia.Data.Converters; +using Avalonia.Input; +using Avalonia.Layout; +using Avalonia.Media; +using Ursa.Controls.Shapes; + +namespace Ursa.Controls; + +public class DisabledAdorner +{ + public static readonly AttachedProperty IsEnabledProperty = + AvaloniaProperty.RegisterAttached("IsEnabled"); + + public static void SetIsEnabled(InputElement obj, bool value) => obj.SetValue(IsEnabledProperty, value); + public static bool GetIsEnabled(InputElement obj) => obj.GetValue(IsEnabledProperty); + + public static readonly AttachedProperty DisabledTipProperty = + AvaloniaProperty.RegisterAttached("DisabledTip"); + + public static void SetDisabledTip(InputElement obj, object? value) => obj.SetValue(DisabledTipProperty, value); + public static object? GetDisabledTip(InputElement obj) => obj.GetValue(DisabledTipProperty); + + static DisabledAdorner() + { + IsEnabledProperty.Changed.AddClassHandler(OnIsEnabledChanged); + } + + private static void OnIsEnabledChanged(InputElement arg1, AvaloniaPropertyChangedEventArgs arg2) + { + if (arg2.NewValue.Value) + { + var pureRectangle = new Border() + { + Background = Brushes.Transparent, + IsHitTestVisible = true, + HorizontalAlignment = HorizontalAlignment.Stretch, + VerticalAlignment = VerticalAlignment.Stretch, + Cursor = new Cursor(StandardCursorType.No), + [!ToolTip.TipProperty] = arg1[!DisabledTipProperty], + }; + var binding = arg1.GetObservable(InputElement.IsEnabledProperty, converter: (a) => !a).ToBinding(); + pureRectangle.Bind(Visual.IsVisibleProperty, binding); + AdornerLayer.SetAdorner(arg1, pureRectangle); + } + else + { + AdornerLayer.SetAdorner(arg1, null); + } + + } +} \ No newline at end of file