浏览代码

Merge pull request #9607 from robloo/ischeckedchanged-event

Add IsCheckedChanged Event to ToggleButton (Obsolete Older Events)
Max Katz 2 年之前
父节点
当前提交
1e72fb920c

+ 66 - 16
src/Avalonia.Controls/Primitives/ToggleButton.cs

@@ -32,26 +32,42 @@ namespace Avalonia.Controls.Primitives
         /// <summary>
         /// Defines the <see cref="Checked"/> event.
         /// </summary>
+        [Obsolete("Use IsCheckedChangedEvent instead.")]
         public static readonly RoutedEvent<RoutedEventArgs> CheckedEvent =
-            RoutedEvent.Register<ToggleButton, RoutedEventArgs>(nameof(Checked), RoutingStrategies.Bubble);
+            RoutedEvent.Register<ToggleButton, RoutedEventArgs>(
+                nameof(Checked),
+                RoutingStrategies.Bubble);
 
         /// <summary>
         /// Defines the <see cref="Unchecked"/> event.
         /// </summary>
+        [Obsolete("Use IsCheckedChangedEvent instead.")]
         public static readonly RoutedEvent<RoutedEventArgs> UncheckedEvent =
-            RoutedEvent.Register<ToggleButton, RoutedEventArgs>(nameof(Unchecked), RoutingStrategies.Bubble);
+            RoutedEvent.Register<ToggleButton, RoutedEventArgs>(
+                nameof(Unchecked),
+                RoutingStrategies.Bubble);
 
         /// <summary>
         /// Defines the <see cref="Unchecked"/> event.
         /// </summary>
+        [Obsolete("Use IsCheckedChangedEvent instead.")]
         public static readonly RoutedEvent<RoutedEventArgs> IndeterminateEvent =
-            RoutedEvent.Register<ToggleButton, RoutedEventArgs>(nameof(Indeterminate), RoutingStrategies.Bubble);
+            RoutedEvent.Register<ToggleButton, RoutedEventArgs>(
+                nameof(Indeterminate),
+                RoutingStrategies.Bubble);
+
+        /// <summary>
+        /// Defines the <see cref="IsCheckedChanged"/> event.
+        /// </summary>
+        public static readonly RoutedEvent<RoutedEventArgs> IsCheckedChangedEvent =
+            RoutedEvent.Register<ToggleButton, RoutedEventArgs>(
+                nameof(IsCheckedChanged),
+                RoutingStrategies.Bubble);
 
         private bool? _isChecked = false;
 
         static ToggleButton()
         {
-            IsCheckedProperty.Changed.AddClassHandler<ToggleButton>((x, e) => x.OnIsCheckedChanged(e));
         }
 
         public ToggleButton()
@@ -62,6 +78,7 @@ namespace Avalonia.Controls.Primitives
         /// <summary>
         /// Raised when a <see cref="ToggleButton"/> is checked.
         /// </summary>
+        [Obsolete("Use IsCheckedChanged instead.")]
         public event EventHandler<RoutedEventArgs>? Checked
         {
             add => AddHandler(CheckedEvent, value);
@@ -71,6 +88,7 @@ namespace Avalonia.Controls.Primitives
         /// <summary>
         /// Raised when a <see cref="ToggleButton"/> is unchecked.
         /// </summary>
+        [Obsolete("Use IsCheckedChanged instead.")]
         public event EventHandler<RoutedEventArgs>? Unchecked
         {
             add => AddHandler(UncheckedEvent, value);
@@ -80,12 +98,22 @@ namespace Avalonia.Controls.Primitives
         /// <summary>
         /// Raised when a <see cref="ToggleButton"/> is neither checked nor unchecked.
         /// </summary>
+        [Obsolete("Use IsCheckedChanged instead.")]
         public event EventHandler<RoutedEventArgs>? Indeterminate
         {
             add => AddHandler(IndeterminateEvent, value);
             remove => RemoveHandler(IndeterminateEvent, value);
         }
 
+        /// <summary>
+        /// Raised when the <see cref="IsChecked"/> property value changes.
+        /// </summary>
+        public event EventHandler<RoutedEventArgs>? IsCheckedChanged
+        {
+            add => AddHandler(IsCheckedChangedEvent, value);
+            remove => RemoveHandler(IsCheckedChangedEvent, value);
+        }
+
         /// <summary>
         /// Gets or sets whether the <see cref="ToggleButton"/> is checked.
         /// </summary>
@@ -147,6 +175,7 @@ namespace Avalonia.Controls.Primitives
         /// Called when <see cref="IsChecked"/> becomes true.
         /// </summary>
         /// <param name="e">Event arguments for the routed event that is raised by the default implementation of this method.</param>
+        [Obsolete("Use OnIsCheckedChanged instead.")]
         protected virtual void OnChecked(RoutedEventArgs e)
         {
             RaiseEvent(e);
@@ -156,6 +185,7 @@ namespace Avalonia.Controls.Primitives
         /// Called when <see cref="IsChecked"/> becomes false.
         /// </summary>
         /// <param name="e">Event arguments for the routed event that is raised by the default implementation of this method.</param>
+        [Obsolete("Use OnIsCheckedChanged instead.")]
         protected virtual void OnUnchecked(RoutedEventArgs e)
         {
             RaiseEvent(e);
@@ -165,31 +195,51 @@ namespace Avalonia.Controls.Primitives
         /// Called when <see cref="IsChecked"/> becomes null.
         /// </summary>
         /// <param name="e">Event arguments for the routed event that is raised by the default implementation of this method.</param>
+        [Obsolete("Use OnIsCheckedChanged instead.")]
         protected virtual void OnIndeterminate(RoutedEventArgs e)
         {
             RaiseEvent(e);
         }
 
+        /// <summary>
+        /// Called when <see cref="IsChecked"/> changes.
+        /// </summary>
+        /// <param name="e">Event arguments for the routed event that is raised by the default implementation of this method.</param>
+        protected virtual void OnIsCheckedChanged(RoutedEventArgs e)
+        {
+            RaiseEvent(e);
+        }
+
         protected override AutomationPeer OnCreateAutomationPeer()
         {
             return new ToggleButtonAutomationPeer(this);
         }
 
-        private void OnIsCheckedChanged(AvaloniaPropertyChangedEventArgs e)
+        /// <inheritdoc/>
+        protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
         {
-            var newValue = (bool?)e.NewValue;
+            base.OnPropertyChanged(change);
 
-            switch (newValue)
+            if (change.Property == IsCheckedProperty)
             {
-                case true:
-                    OnChecked(new RoutedEventArgs(CheckedEvent));
-                    break;
-                case false:
-                    OnUnchecked(new RoutedEventArgs(UncheckedEvent));
-                    break;
-                default:
-                    OnIndeterminate(new RoutedEventArgs(IndeterminateEvent));
-                    break;
+                var newValue = change.GetNewValue<bool?>();
+
+#pragma warning disable CS0618 // Type or member is obsolete
+                switch (newValue)
+                {
+                    case true:
+                        OnChecked(new RoutedEventArgs(CheckedEvent));
+                        break;
+                    case false:
+                        OnUnchecked(new RoutedEventArgs(UncheckedEvent));
+                        break;
+                    default:
+                        OnIndeterminate(new RoutedEventArgs(IndeterminateEvent));
+                        break;
+                }
+#pragma warning restore CS0618 // Type or member is obsolete
+
+                OnIsCheckedChanged(new RoutedEventArgs(IsCheckedChangedEvent));
             }
         }
 

+ 4 - 22
src/Avalonia.Controls/SplitButton/SplitButton.cs

@@ -25,7 +25,7 @@ namespace Avalonia.Controls
         /// <summary>
         /// Raised when the user presses the primary part of the <see cref="SplitButton"/>.
         /// </summary>
-        public event EventHandler<RoutedEventArgs> Click
+        public event EventHandler<RoutedEventArgs>? Click
         {
             add => AddHandler(ClickEvent, value);
             remove => RemoveHandler(ClickEvent, value);
@@ -35,7 +35,9 @@ namespace Avalonia.Controls
         /// Defines the <see cref="Click"/> event.
         /// </summary>
         public static readonly RoutedEvent<RoutedEventArgs> ClickEvent =
-            RoutedEvent.Register<SplitButton, RoutedEventArgs>(nameof(Click), RoutingStrategies.Bubble);
+            RoutedEvent.Register<SplitButton, RoutedEventArgs>(
+                nameof(Click),
+                RoutingStrategies.Bubble);
 
         /// <summary>
         /// Defines the <see cref="Command"/> property.
@@ -69,10 +71,6 @@ namespace Avalonia.Controls
 
         private IDisposable? _flyoutPropertyChangedDisposable;
 
-        ////////////////////////////////////////////////////////////////////////
-        // Constructor / Destructors
-        ////////////////////////////////////////////////////////////////////////
-
         /// <summary>
         /// Initializes a new instance of the <see cref="SplitButton"/> class.
         /// </summary>
@@ -80,10 +78,6 @@ namespace Avalonia.Controls
         {
         }
 
-        ////////////////////////////////////////////////////////////////////////
-        // Properties
-        ////////////////////////////////////////////////////////////////////////
-
         /// <summary>
         /// Gets or sets the <see cref="ICommand"/> invoked when the primary part is pressed.
         /// </summary>
@@ -124,10 +118,6 @@ namespace Avalonia.Controls
         /// <inheritdoc/>
         protected override bool IsEnabledCore => base.IsEnabledCore && _commandCanExecute;
 
-        ////////////////////////////////////////////////////////////////////////
-        // Methods
-        ////////////////////////////////////////////////////////////////////////
-
         /// <inheritdoc/>
         void ICommandSource.CanExecuteChanged(object sender, EventArgs e) => this.CanExecuteChanged(sender, e);
 
@@ -222,10 +212,6 @@ namespace Avalonia.Controls
             }
         }
 
-        ////////////////////////////////////////////////////////////////////////
-        // OnEvent Overridable Methods
-        ////////////////////////////////////////////////////////////////////////
-
         /// <inheritdoc/>
         protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
         {
@@ -429,10 +415,6 @@ namespace Avalonia.Controls
             // Available for derived types
         }
 
-        ////////////////////////////////////////////////////////////////////////
-        // Event Handling
-        ////////////////////////////////////////////////////////////////////////
-
         /// <summary>
         /// Event handler for when the internal primary button part is pressed.
         /// </summary>

+ 1 - 17
src/Avalonia.Controls/SplitButton/ToggleSplitButton.cs

@@ -18,7 +18,7 @@ namespace Avalonia.Controls
         /// <summary>
         /// Raised when the <see cref="IsChecked"/> property value changes.
         /// </summary>
-        public event EventHandler<RoutedEventArgs> IsCheckedChanged
+        public event EventHandler<RoutedEventArgs>? IsCheckedChanged
         {
             add => AddHandler(IsCheckedChangedEvent, value);
             remove => RemoveHandler(IsCheckedChangedEvent, value);
@@ -39,10 +39,6 @@ namespace Avalonia.Controls
             AvaloniaProperty.Register<ToggleSplitButton, bool>(
                 nameof(IsChecked));
 
-        ////////////////////////////////////////////////////////////////////////
-        // Constructor / Destructors
-        ////////////////////////////////////////////////////////////////////////
-
         /// <summary>
         /// Initializes a new instance of the <see cref="ToggleSplitButton"/> class.
         /// </summary>
@@ -50,10 +46,6 @@ namespace Avalonia.Controls
         {
         }
 
-        ////////////////////////////////////////////////////////////////////////
-        // Properties
-        ////////////////////////////////////////////////////////////////////////
-
         /// <summary>
         /// Gets or sets a value indicating whether the <see cref="ToggleSplitButton"/> is checked.
         /// </summary>
@@ -73,10 +65,6 @@ namespace Avalonia.Controls
         /// </remarks>
         Type IStyleable.StyleKey => typeof(SplitButton);
 
-        ////////////////////////////////////////////////////////////////////////
-        // Methods
-        ////////////////////////////////////////////////////////////////////////
-
         /// <summary>
         /// Toggles the <see cref="IsChecked"/> property between true and false.
         /// </summary>
@@ -85,10 +73,6 @@ namespace Avalonia.Controls
             IsChecked = !IsChecked;
         }
 
-        ////////////////////////////////////////////////////////////////////////
-        // OnEvent Overridable Methods
-        ////////////////////////////////////////////////////////////////////////
-
         /// <inheritdoc/>
         protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs e)
         {