diff --git a/Directory.Packages.props b/Directory.Packages.props
index 007bca511..c98daeb34 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -15,7 +15,6 @@
-
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Animations/FadeInBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Animations/FadeInBehavior.cs
index e9d1a99d4..a21f1d7a4 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Animations/FadeInBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Animations/FadeInBehavior.cs
@@ -1,7 +1,6 @@
using System;
using Avalonia.Animation;
using Avalonia.Styling;
-using System.Reactive.Disposables;
namespace Avalonia.Xaml.Interactions.Custom;
@@ -43,12 +42,11 @@ public TimeSpan Duration
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
if (AssociatedObject is null)
{
- return;
+ return DisposableAction.Empty;
}
var totalDuration = InitialDelay + Duration;
@@ -64,5 +62,7 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
}
};
animation.RunAsync(AssociatedObject);
+
+ return DisposableAction.Empty;
}
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/AutoCompleteBox/FocusAutoCompleteBoxTextBoxBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/AutoCompleteBox/FocusAutoCompleteBoxTextBoxBehavior.cs
index 6dcd6abce..9c33660f4 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/AutoCompleteBox/FocusAutoCompleteBoxTextBoxBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/AutoCompleteBox/FocusAutoCompleteBoxTextBoxBehavior.cs
@@ -1,5 +1,5 @@
+using System;
using System.Linq;
-using System.Reactive.Disposables;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Threading;
@@ -13,16 +13,16 @@ namespace Avalonia.Xaml.Interactions.Custom;
public class FocusAutoCompleteBoxTextBoxBehavior : AttachedToVisualTreeBehavior
{
///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ protected override IDisposable OnAttachedToVisualTreeOverride()
{
if (AssociatedObject is null)
{
- return;
+ return DisposableAction.Empty;
}
AssociatedObject.GotFocus += AssociatedObjectOnGotFocus;
- Disposable.Create(() => AssociatedObject.GotFocus -= AssociatedObjectOnGotFocus);
+ return DisposableAction.Create(() => AssociatedObject.GotFocus -= AssociatedObjectOnGotFocus);
}
private void AssociatedObjectOnGotFocus(object? sender, GotFocusEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Avalonia.Xaml.Interactions.Custom.csproj b/src/Avalonia.Xaml.Interactions.Custom/Avalonia.Xaml.Interactions.Custom.csproj
index 6a7e203e4..845185c3e 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Avalonia.Xaml.Interactions.Custom.csproj
+++ b/src/Avalonia.Xaml.Interactions.Custom/Avalonia.Xaml.Interactions.Custom.csproj
@@ -15,7 +15,6 @@
-
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Button/ButtonExecuteCommandOnKeyDownBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Button/ButtonExecuteCommandOnKeyDownBehavior.cs
index 17f47ed72..6e6038537 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Button/ButtonExecuteCommandOnKeyDownBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Button/ButtonExecuteCommandOnKeyDownBehavior.cs
@@ -1,5 +1,4 @@
using System.Linq;
-using System.Reactive.Disposables;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -17,14 +16,15 @@ public class ButtonExecuteCommandOnKeyDownBehavior : ExecuteCommandOnKeyBehavior
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposables)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
if (AssociatedObject?.GetVisualRoot() is InputElement inputRoot)
{
- var disposable = inputRoot.AddDisposableHandler(InputElement.KeyDownEvent, RootDefaultKeyDown);
- disposables.Add(disposable);
+ return inputRoot.AddDisposableHandler(InputElement.KeyDownEvent, RootDefaultKeyDown);
}
+
+ return DisposableAction.Empty;
}
private void RootDefaultKeyDown(object? sender, KeyEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Button/ButtonHideFlyoutBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Button/ButtonHideFlyoutBehavior.cs
index a30d9a4bc..2cbb35563 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Button/ButtonHideFlyoutBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Button/ButtonHideFlyoutBehavior.cs
@@ -1,6 +1,6 @@
using System;
-using System.Reactive.Disposables;
using Avalonia.Controls;
+using Avalonia.Reactive;
namespace Avalonia.Xaml.Interactions.Custom;
@@ -27,18 +27,16 @@ public bool IsFlyoutOpen
///
///
///
- ///
- protected override void OnAttached(CompositeDisposable disposables)
+ ///
+ protected override IDisposable OnAttachedOverride()
{
- var disposable = this.GetObservable(IsFlyoutOpenProperty)
- .Subscribe(isOpen =>
+ return this.GetObservable(IsFlyoutOpenProperty)
+ .Subscribe(new AnonymousObserver(isOpen =>
{
if (!isOpen)
{
AssociatedObject?.Flyout?.Hide();
}
- });
-
- disposables.Add(disposable);
+ }));
}
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Button/ButtonHideFlyoutOnClickBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Button/ButtonHideFlyoutOnClickBehavior.cs
index 3535fb323..af01d3701 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Button/ButtonHideFlyoutOnClickBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Button/ButtonHideFlyoutOnClickBehavior.cs
@@ -1,6 +1,3 @@
-using System;
-using System.Reactive.Disposables;
-using System.Reactive.Linq;
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
using Avalonia.Interactivity;
@@ -16,33 +13,39 @@ public class ButtonHideFlyoutOnClickBehavior : AttachedToVisualTreeBehavior
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposables)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
- if (AssociatedObject is null)
+ var button = AssociatedObject;
+
+ if (button is null)
{
- return;
+ return DisposableAction.Empty;
}
- var flyoutPresenter = AssociatedObject.FindAncestorOfType();
+ var flyoutPresenter = button.FindAncestorOfType();
if (flyoutPresenter?.Parent is not Popup popup)
{
- return;
+ return DisposableAction.Empty;
}
- var disposable = Observable
- .FromEventPattern(handler => AssociatedObject.Click += handler, handler => AssociatedObject.Click -= handler)
- .Do(_ =>
- {
- // Execute Command if any before closing. Otherwise, it won't execute because Close will destroy the associated object before Click can execute it.
- if (AssociatedObject.Command != null && AssociatedObject.IsEnabled)
- {
- AssociatedObject.Command.Execute(AssociatedObject.CommandParameter);
- }
- popup.Close();
- })
- .Subscribe();
-
- disposables.Add(disposable);
+ button.Click += AssociatedObjectOnClick;
+
+ return DisposableAction.Create(() =>
+ {
+ button.Click -= AssociatedObjectOnClick;
+ });
+
+ void AssociatedObjectOnClick(object? sender, RoutedEventArgs e)
+ {
+ // Execute Command if any before closing. Otherwise, it won't execute because Close will destroy the associated object before Click can execute it.
+ if (button.Command != null && button.IsEnabled)
+ {
+ button.Command.Execute(button.CommandParameter);
+ }
+ popup.Close();
+ }
}
+
+
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Control/BindPointerOverBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Control/BindPointerOverBehavior.cs
index 587969de1..760fea568 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Control/BindPointerOverBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Control/BindPointerOverBehavior.cs
@@ -1,4 +1,4 @@
-using System.Reactive.Disposables;
+using System;
using Avalonia.Controls;
using Avalonia.Data;
using Avalonia.Input;
@@ -28,21 +28,22 @@ public bool IsPointerOver
///
///
///
- ///
- protected override void OnAttached(CompositeDisposable disposables)
+ ///
+ protected override IDisposable OnAttachedOverride()
{
if (AssociatedObject is null)
{
- return;
+ return DisposableAction.Empty;
}
var control = AssociatedObject;
control.PropertyChanged += AssociatedObjectOnPropertyChanged;
- disposables.Add(Disposable.Create(() => control.PropertyChanged -= AssociatedObjectOnPropertyChanged));
- disposables.Add(Disposable.Create(() => IsPointerOver = false));
-
- return;
+ return DisposableAction.Create(() =>
+ {
+ control.PropertyChanged -= AssociatedObjectOnPropertyChanged;
+ IsPointerOver = false;
+ });
void AssociatedObjectOnPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e)
{
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Control/BindTagToVisualRootDataContextBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Control/BindTagToVisualRootDataContextBehavior.cs
index 52aea4f2c..7cf4e63b0 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Control/BindTagToVisualRootDataContextBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Control/BindTagToVisualRootDataContextBehavior.cs
@@ -1,5 +1,4 @@
using System;
-using System.Reactive.Disposables;
using Avalonia.Controls;
using Avalonia.VisualTree;
@@ -13,16 +12,17 @@ public class BindTagToVisualRootDataContextBehavior : DisposingBehavior
///
///
///
- ///
+ ///
///
- protected override void OnAttached(CompositeDisposable disposables)
+ protected override IDisposable OnAttachedOverride()
{
var visualRoot = (Control?)AssociatedObject?.GetVisualRoot();
if (visualRoot is not null)
{
- var disposable = BindDataContextToTag(visualRoot, AssociatedObject);
- disposables.Add(disposable);
+ return BindDataContextToTag(visualRoot, AssociatedObject);
}
+
+ return DisposableAction.Empty;
}
private static IDisposable BindDataContextToTag(Control source, Control? target)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Control/BoundsObserverBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Control/BoundsObserverBehavior.cs
index 7dab95d4e..256190a28 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Control/BoundsObserverBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Control/BoundsObserverBehavior.cs
@@ -1,7 +1,7 @@
-using System.Reactive;
-using System.Reactive.Disposables;
+using System;
using Avalonia.Controls;
using Avalonia.Data;
+using Avalonia.Reactive;
namespace Avalonia.Xaml.Interactions.Custom;
@@ -60,17 +60,19 @@ public double Height
///
/// Attaches the behavior to the associated control and starts observing its bounds to update the Width and Height properties accordingly.
///
- /// A composite disposable used to manage the lifecycle of subscriptions and other disposables.
- protected override void OnAttached(CompositeDisposable disposables)
+ /// A disposable resource to be disposed when the behavior is detached.
+ protected override IDisposable OnAttachedOverride()
{
if (AssociatedObject is not null)
{
- disposables.Add(this.GetObservable(BoundsProperty)
+ return this.GetObservable(BoundsProperty)
.Subscribe(new AnonymousObserver(bounds =>
{
Width = bounds.Width;
Height = bounds.Height;
- })));
+ }));
}
+
+ return DisposableAction.Empty;
}
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Control/HideAttachedFlyoutBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Control/HideAttachedFlyoutBehavior.cs
index 43ddb0559..82c6bebe5 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Control/HideAttachedFlyoutBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Control/HideAttachedFlyoutBehavior.cs
@@ -1,7 +1,7 @@
using System;
-using System.Reactive.Disposables;
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
+using Avalonia.Reactive;
namespace Avalonia.Xaml.Interactions.Custom;
@@ -28,18 +28,17 @@ public bool IsFlyoutOpen
///
///
///
- ///
- protected override void OnAttached(CompositeDisposable disposables)
+ ///
+ protected override IDisposable OnAttachedOverride()
{
- var disposable = this.GetObservable(IsFlyoutOpenProperty)
- .Subscribe(isOpen =>
- {
- if (!isOpen && AssociatedObject is not null)
+ return this.GetObservable(IsFlyoutOpenProperty)
+ .Subscribe(new AnonymousObserver(
+ isOpen =>
{
- FlyoutBase.GetAttachedFlyout(AssociatedObject)?.Hide();
- }
- });
-
- disposables.Add(disposable);
+ if (!isOpen && AssociatedObject is not null)
+ {
+ FlyoutBase.GetAttachedFlyout(AssociatedObject)?.Hide();
+ }
+ }));
}
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Core/ActualThemeVariantChangedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Core/ActualThemeVariantChangedBehavior.cs
index 4f2e924e4..5f442f02b 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Core/ActualThemeVariantChangedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Core/ActualThemeVariantChangedBehavior.cs
@@ -1,4 +1,4 @@
-using System.Reactive.Disposables;
+using System;
using Avalonia.Xaml.Interactivity;
namespace Avalonia.Xaml.Interactions.Custom;
@@ -9,23 +9,29 @@ namespace Avalonia.Xaml.Interactions.Custom;
///
public abstract class ActualThemeVariantChangedBehavior : DisposingBehavior where T : StyledElement
{
- private CompositeDisposable? _disposables;
-
+ private IDisposable? _disposable;
+
///
- protected override void OnAttached(CompositeDisposable disposables)
+ protected override IDisposable OnAttachedOverride()
{
- _disposables = disposables;
+ return new DisposableAction(OnDelayedDispose);
}
///
protected override void OnActualThemeVariantChangedEvent()
{
- OnActualThemeVariantChangedEvent(_disposables!);
+ _disposable = OnActualThemeVariantChangedEventOverride();
}
///
/// Called when the ActualThemeVariantChanged event is raised.
///
- /// The group of disposable resources that are disposed together
- protected abstract void OnActualThemeVariantChangedEvent(CompositeDisposable disposable);
+ /// A disposable resource to be disposed when the behavior is detached.
+ protected abstract IDisposable OnActualThemeVariantChangedEventOverride();
+
+ private void OnDelayedDispose()
+ {
+ _disposable?.Dispose();
+ _disposable = null;
+ }
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Core/AttachedToLogicalTreeBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Core/AttachedToLogicalTreeBehavior.cs
index 82f87ad2d..4df6b10da 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Core/AttachedToLogicalTreeBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Core/AttachedToLogicalTreeBehavior.cs
@@ -1,4 +1,4 @@
-using System.Reactive.Disposables;
+using System;
using Avalonia.Xaml.Interactivity;
namespace Avalonia.Xaml.Interactions.Custom;
@@ -9,23 +9,28 @@ namespace Avalonia.Xaml.Interactions.Custom;
///
public abstract class AttachedToLogicalTreeBehavior : DisposingBehavior where T : StyledElement
{
- private CompositeDisposable? _disposables;
+ private IDisposable? _disposable;
///
- protected override void OnAttached(CompositeDisposable disposables)
+ protected override IDisposable OnAttachedOverride()
{
- _disposables = disposables;
+ return new DisposableAction(OnDelayedDispose);
}
///
protected override void OnAttachedToLogicalTree()
{
- OnAttachedToLogicalTree(_disposables!);
+ _disposable = OnAttachedToLogicalTreeOverride();
}
///
/// Called after the is attached to the logical tree.
///
- /// The group of disposable resources that are disposed together
- protected abstract void OnAttachedToLogicalTree(CompositeDisposable disposable);
+ /// A disposable resource to be disposed when the behavior is detached.
+ protected abstract IDisposable OnAttachedToLogicalTreeOverride();
+
+ private void OnDelayedDispose()
+ {
+ _disposable?.Dispose();
+ }
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Core/AttachedToLogicalTreeTriggerBase.cs b/src/Avalonia.Xaml.Interactions.Custom/Core/AttachedToLogicalTreeTriggerBase.cs
new file mode 100644
index 000000000..f7a181a91
--- /dev/null
+++ b/src/Avalonia.Xaml.Interactions.Custom/Core/AttachedToLogicalTreeTriggerBase.cs
@@ -0,0 +1,37 @@
+using System;
+using Avalonia.Xaml.Interactivity;
+
+namespace Avalonia.Xaml.Interactions.Custom;
+
+///
+/// A trigger that executes when the associated object is attached to the logical tree.
+///
+///
+public abstract class AttachedToLogicalTreeTriggerBase : DisposingTrigger where T : Visual
+{
+ private IDisposable? _disposable;
+
+ ///
+ protected override IDisposable OnAttachedOverride()
+ {
+ return new DisposableAction(OnDelayedDispose);
+ }
+
+ ///
+ protected override void OnAttachedToLogicalTree()
+ {
+ _disposable = OnAttachedToLogicalTreeOverride();
+ }
+
+ ///
+ /// Called after the is attached to the logical tree.
+ ///
+ /// A disposable resource to be disposed when the behavior is detached.
+ protected abstract IDisposable OnAttachedToLogicalTreeOverride();
+
+ private void OnDelayedDispose()
+ {
+ _disposable?.Dispose();
+ _disposable = null;
+ }
+}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Core/AttachedToVisualTreeBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Core/AttachedToVisualTreeBehavior.cs
index 48be0ee09..6258cb71b 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Core/AttachedToVisualTreeBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Core/AttachedToVisualTreeBehavior.cs
@@ -1,4 +1,4 @@
-using System.Reactive.Disposables;
+using System;
using Avalonia.Xaml.Interactivity;
namespace Avalonia.Xaml.Interactions.Custom;
@@ -9,23 +9,29 @@ namespace Avalonia.Xaml.Interactions.Custom;
///
public abstract class AttachedToVisualTreeBehavior : DisposingBehavior where T : Visual
{
- private CompositeDisposable? _disposables;
+ private IDisposable? _disposable;
///
- protected override void OnAttached(CompositeDisposable disposables)
+ protected override IDisposable OnAttachedOverride()
{
- _disposables = disposables;
+ return new DisposableAction(OnDelayedDispose);
}
///
protected override void OnAttachedToVisualTree()
{
- OnAttachedToVisualTree(_disposables!);
+ _disposable = OnAttachedToVisualTreeOverride();
}
///
/// Called after the is attached to the visual tree.
///
- /// The group of disposable resources that are disposed together
- protected abstract void OnAttachedToVisualTree(CompositeDisposable disposable);
+ /// A disposable resource to be disposed when the behavior is detached.
+ protected abstract IDisposable OnAttachedToVisualTreeOverride();
+
+ private void OnDelayedDispose()
+ {
+ _disposable?.Dispose();
+ _disposable = null;
+ }
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Core/AttachedToVisualTreeTrigger.cs b/src/Avalonia.Xaml.Interactions.Custom/Core/AttachedToVisualTreeTrigger.cs
index d987f810a..32d6355a3 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Core/AttachedToVisualTreeTrigger.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Core/AttachedToVisualTreeTrigger.cs
@@ -3,7 +3,7 @@
namespace Avalonia.Xaml.Interactions.Custom;
///
-///
+/// A trigger that executes when the associated object is attached to the visual tree.
///
public class AttachedToVisualTreeTrigger : StyledElementTrigger
{
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Core/AttachedToVisualTreeTriggerBase.cs b/src/Avalonia.Xaml.Interactions.Custom/Core/AttachedToVisualTreeTriggerBase.cs
new file mode 100644
index 000000000..f1e9bfa9b
--- /dev/null
+++ b/src/Avalonia.Xaml.Interactions.Custom/Core/AttachedToVisualTreeTriggerBase.cs
@@ -0,0 +1,37 @@
+using System;
+using Avalonia.Xaml.Interactivity;
+
+namespace Avalonia.Xaml.Interactions.Custom;
+
+///
+/// A trigger that executes when the associated object is attached to the visual tree.
+///
+///
+public abstract class AttachedToVisualTreeTriggerBase : DisposingTrigger where T : Visual
+{
+ private IDisposable? _disposable;
+
+ ///
+ protected override IDisposable OnAttachedOverride()
+ {
+ return new DisposableAction(OnDelayedDispose);
+ }
+
+ ///
+ protected override void OnAttachedToVisualTree()
+ {
+ _disposable = OnAttachedToVisualTreeOverride();
+ }
+
+ ///
+ /// Called after the is attached to the visual tree.
+ ///
+ /// A disposable resource to be disposed when the behavior is detached.
+ protected abstract IDisposable OnAttachedToVisualTreeOverride();
+
+ private void OnDelayedDispose()
+ {
+ _disposable?.Dispose();
+ _disposable = null;
+ }
+}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Core/BindingBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Core/BindingBehavior.cs
index 26326e21f..d92c4a67a 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Core/BindingBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Core/BindingBehavior.cs
@@ -1,4 +1,4 @@
-using System.Reactive.Disposables;
+using System;
using Avalonia.Controls;
using Avalonia.Data;
@@ -59,13 +59,14 @@ public IBinding? Binding
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
if (TargetObject is not null && TargetProperty is not null && Binding is not null)
{
- var dispose = TargetObject.Bind(TargetProperty, Binding);
- disposable.Add(dispose);
+ return TargetObject.Bind(TargetProperty, Binding);
}
+
+ return DisposableAction.Empty;
}
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Core/DataContextChangedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Core/DataContextChangedBehavior.cs
index bceaf1d1e..408c836df 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Core/DataContextChangedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Core/DataContextChangedBehavior.cs
@@ -1,4 +1,4 @@
-using System.Reactive.Disposables;
+using System;
using Avalonia.Xaml.Interactivity;
namespace Avalonia.Xaml.Interactions.Custom;
@@ -9,23 +9,29 @@ namespace Avalonia.Xaml.Interactions.Custom;
///
public abstract class DataContextChangedBehavior : DisposingBehavior where T : StyledElement
{
- private CompositeDisposable? _disposables;
+ private IDisposable? _disposable;
///
- protected override void OnAttached(CompositeDisposable disposables)
+ protected override IDisposable OnAttachedOverride()
{
- _disposables = disposables;
+ return new DisposableAction(OnDelayedDispose);
}
///
protected override void OnDataContextChangedEvent()
{
- OnDataContextChangedEvent(_disposables!);
+ _disposable = OnDataContextChangedEventOverride();
}
///
/// Called when the DataContextChanged event is raised.
///
- /// The group of disposable resources that are disposed together
- protected abstract void OnDataContextChangedEvent(CompositeDisposable disposable);
+ /// A disposable resource to be disposed when the behavior is detached.
+ protected abstract IDisposable OnDataContextChangedEventOverride();
+
+ private void OnDelayedDispose()
+ {
+ _disposable?.Dispose();
+ _disposable = null;
+ }
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Core/DisposableAction.cs b/src/Avalonia.Xaml.Interactions.Custom/Core/DisposableAction.cs
new file mode 100644
index 000000000..f8fcaf486
--- /dev/null
+++ b/src/Avalonia.Xaml.Interactions.Custom/Core/DisposableAction.cs
@@ -0,0 +1,27 @@
+
+namespace Avalonia.Xaml.Interactions.Custom;
+///
+/// Represents an that executes a specified action when disposed.
+///
+/// The action to execute when disposed.
+public class DisposableAction(System.Action dispose) : System.IDisposable
+{
+ ///
+ /// An empty disposable that does nothing when disposed.
+ ///
+ // ReSharper disable once InconsistentNaming
+ public static readonly System.IDisposable Empty = new DisposableAction(() => { });
+
+ ///
+ /// Creates a new that executes the specified action when disposed.
+ ///
+ /// The action to execute when disposed.
+ /// A new instance of .
+ public static System.IDisposable Create(System.Action dispose)
+ => new DisposableAction(dispose);
+
+ ///
+ /// Executes the dispose action.
+ ///
+ void System.IDisposable.Dispose() => dispose();
+}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Core/DisposingBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Core/DisposingBehavior.cs
index d8e9ec4e2..ce4bd21ac 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Core/DisposingBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Core/DisposingBehavior.cs
@@ -1,4 +1,4 @@
-using System.Reactive.Disposables;
+using System;
using Avalonia.Xaml.Interactivity;
namespace Avalonia.Xaml.Interactions.Custom;
@@ -9,31 +9,29 @@ namespace Avalonia.Xaml.Interactions.Custom;
/// The object type to attach to
public abstract class DisposingBehavior : StyledElementBehavior where T : AvaloniaObject
{
- private CompositeDisposable? _disposables;
+ private IDisposable? _disposable;
///
protected override void OnAttached()
{
base.OnAttached();
- _disposables?.Dispose();
-
- _disposables = new CompositeDisposable();
-
- OnAttached(_disposables);
+ _disposable?.Dispose();
+ _disposable = OnAttachedOverride();
}
///
/// Called after the behavior is attached to the .
///
- /// The group of disposable resources that are disposed together.
- protected abstract void OnAttached(CompositeDisposable disposables);
+ /// A disposable resource to be disposed when the behavior is detached.
+ protected abstract IDisposable OnAttachedOverride();
///
protected override void OnDetaching()
{
base.OnDetaching();
- _disposables?.Dispose();
+ _disposable?.Dispose();
+ _disposable = null;
}
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Core/DisposingTrigger.cs b/src/Avalonia.Xaml.Interactions.Custom/Core/DisposingTrigger.cs
index 33f436103..fd52d88f8 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Core/DisposingTrigger.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Core/DisposingTrigger.cs
@@ -1,14 +1,15 @@
-using System.Reactive.Disposables;
+using System;
using Avalonia.Xaml.Interactivity;
namespace Avalonia.Xaml.Interactions.Custom;
///
-///
+/// A base class for triggers that require a disposable resource.
///
-public abstract class DisposingTrigger : StyledElementTrigger
+/// The object type to attach to
+public abstract class DisposingTrigger : StyledElementTrigger where T : AvaloniaObject
{
- private readonly CompositeDisposable _disposables = new();
+ private IDisposable? _disposable;
///
///
@@ -17,14 +18,15 @@ protected override void OnAttached()
{
base.OnAttached();
- OnAttached(_disposables);
+ _disposable?.Dispose();
+ _disposable = OnAttachedOverride();
}
///
///
///
- ///
- protected abstract void OnAttached(CompositeDisposable disposables);
+ /// A disposable resource to be disposed when the behavior is detached.
+ protected abstract IDisposable OnAttachedOverride();
///
///
@@ -33,6 +35,6 @@ protected override void OnDetaching()
{
base.OnDetaching();
- _disposables.Dispose();
+ _disposable?.Dispose();
}
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Core/InitializedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Core/InitializedBehavior.cs
index 7a5e242b2..35c2dda41 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Core/InitializedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Core/InitializedBehavior.cs
@@ -1,4 +1,4 @@
-using System.Reactive.Disposables;
+using System;
using Avalonia.Xaml.Interactivity;
namespace Avalonia.Xaml.Interactions.Custom;
@@ -9,23 +9,29 @@ namespace Avalonia.Xaml.Interactions.Custom;
///
public abstract class InitializedBehavior : DisposingBehavior where T : StyledElement
{
- private CompositeDisposable? _disposables;
+ private IDisposable? _disposable;
///
- protected override void OnAttached(CompositeDisposable disposables)
+ protected override IDisposable OnAttachedOverride()
{
- _disposables = disposables;
+ return new DisposableAction(OnDelayedDispose);
}
///
protected override void OnInitializedEvent()
{
- OnInitializedEvent(_disposables!);
+ _disposable = OnInitializedEventOverride();
}
///
/// Called when the Initialized event is raised.
///
- /// The group of disposable resources that are disposed together
- protected abstract void OnInitializedEvent(CompositeDisposable disposable);
+ /// A disposable resource to be disposed when the behavior is detached.
+ protected abstract IDisposable OnInitializedEventOverride();
+
+ private void OnDelayedDispose()
+ {
+ _disposable?.Dispose();
+ _disposable = null;
+ }
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Core/LoadedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Core/LoadedBehavior.cs
index 92d92a9c2..1065ea1af 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Core/LoadedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Core/LoadedBehavior.cs
@@ -1,4 +1,4 @@
-using System.Reactive.Disposables;
+using System;
using Avalonia.Controls;
using Avalonia.Xaml.Interactivity;
@@ -10,23 +10,28 @@ namespace Avalonia.Xaml.Interactions.Custom;
///
public abstract class LoadedBehavior : DisposingBehavior where T : Control
{
- private CompositeDisposable? _disposables;
+ private IDisposable? _disposable;
///
- protected override void OnAttached(CompositeDisposable disposables)
+ protected override IDisposable OnAttachedOverride()
{
- _disposables = disposables;
+ return new DisposableAction(OnDelayedDispose);
}
///
protected override void OnLoaded()
{
- OnLoaded(_disposables!);
+ _disposable = OnLoadedOverride();
}
///
/// Called after the is loaded.
///
- /// The group of disposable resources that are disposed together
- protected abstract void OnLoaded(CompositeDisposable disposable);
+ /// A disposable resource to be disposed when the behavior is detached.
+ protected abstract IDisposable OnLoadedOverride();
+
+ private void OnDelayedDispose()
+ {
+ _disposable?.Dispose();
+ }
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Core/ResourcesChangedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Core/ResourcesChangedBehavior.cs
index b31763100..a6155e978 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Core/ResourcesChangedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Core/ResourcesChangedBehavior.cs
@@ -1,4 +1,4 @@
-using System.Reactive.Disposables;
+using System;
using Avalonia.Xaml.Interactivity;
namespace Avalonia.Xaml.Interactions.Custom;
@@ -9,23 +9,29 @@ namespace Avalonia.Xaml.Interactions.Custom;
///
public abstract class ResourcesChangedBehavior : DisposingBehavior where T : StyledElement
{
- private CompositeDisposable? _disposables;
+ private IDisposable? _disposable;
///
- protected override void OnAttached(CompositeDisposable disposables)
+ protected override IDisposable OnAttachedOverride()
{
- _disposables = disposables;
+ return new DisposableAction(OnDelayedDispose);
}
///
protected override void OnResourcesChangedEvent()
{
- OnResourcesChangedEvent(_disposables!);
+ _disposable = OnResourcesChangedEventOverride();
}
///
/// Called when the ResourcesChanged event is raised.
///
- /// The group of disposable resources that are disposed together
- protected abstract void OnResourcesChangedEvent(CompositeDisposable disposable);
+ /// A disposable resource to be disposed when the behavior is detached.
+ protected abstract IDisposable OnResourcesChangedEventOverride();
+
+ private void OnDelayedDispose()
+ {
+ _disposable?.Dispose();
+ _disposable = null;
+ }
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Core/RoutedEventTriggerBase.cs b/src/Avalonia.Xaml.Interactions.Custom/Core/RoutedEventTriggerBase.cs
index 70eca292d..7ec43c2d0 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Core/RoutedEventTriggerBase.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Core/RoutedEventTriggerBase.cs
@@ -5,7 +5,7 @@ namespace Avalonia.Xaml.Interactions.Custom;
///
///
///
-public abstract class RoutedEventTriggerBase : DisposingTrigger
+public abstract class RoutedEventTriggerBase : AttachedToVisualTreeTriggerBase
{
///
///
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Core/RoutedEventTriggerBaseOfT.cs b/src/Avalonia.Xaml.Interactions.Custom/Core/RoutedEventTriggerBaseOfT.cs
index c9c7832e2..f00af733a 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Core/RoutedEventTriggerBaseOfT.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Core/RoutedEventTriggerBaseOfT.cs
@@ -1,4 +1,4 @@
-using System.Reactive.Disposables;
+using System;
using Avalonia.Interactivity;
using Avalonia.Xaml.Interactivity;
@@ -10,16 +10,24 @@ namespace Avalonia.Xaml.Interactions.Custom;
///
public abstract class RoutedEventTriggerBase : RoutedEventTriggerBase where T : RoutedEventArgs
{
+ private IDisposable? _disposable;
+
///
///
///
protected abstract RoutedEvent RoutedEvent { get; }
+ ///
+ protected override IDisposable OnAttachedOverride()
+ {
+ return new DisposableAction(OnDelayedDispose);
+ }
+
///
///
///
- ///
- protected override void OnAttached(CompositeDisposable disposables)
+ /// A disposable resource to be disposed when the behavior is detached.
+ protected override IDisposable OnAttachedToVisualTreeOverride()
{
if (AssociatedObject is Interactive interactive)
{
@@ -27,8 +35,10 @@ protected override void OnAttached(CompositeDisposable disposables)
RoutedEvent,
Handler,
EventRoutingStrategy);
- disposables.Add(disposable);
+ return disposable;
}
+
+ return DisposableAction.Empty;
}
///
@@ -55,4 +65,10 @@ protected void Execute(T e)
e.Handled = MarkAsHandled;
Interaction.ExecuteActions(AssociatedObject, Actions, e);
}
+
+ private void OnDelayedDispose()
+ {
+ _disposable?.Dispose();
+ _disposable = null;
+ }
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnActivatedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnActivatedBehavior.cs
index 699ac8f65..f4501f73b 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnActivatedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnActivatedBehavior.cs
@@ -1,5 +1,4 @@
using System;
-using System.Reactive.Disposables;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
@@ -13,8 +12,8 @@ public class ExecuteCommandOnActivatedBehavior : ExecuteCommandBehaviorBase
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime lifetime)
{
@@ -23,9 +22,11 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (mainWindow is not null)
{
mainWindow.Activated += WindowOnActivated;
- disposable.Add(Disposable.Create(() => mainWindow.Activated -= WindowOnActivated));
+ return DisposableAction.Create(() => mainWindow.Activated -= WindowOnActivated);
}
}
+
+ return DisposableAction.Empty;
}
private void WindowOnActivated(object? sender, EventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnDoubleTappedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnDoubleTappedBehavior.cs
index 13bdda7a5..0d2cebdaa 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnDoubleTappedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnDoubleTappedBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnDoubleTappedBehavior : ExecuteCommandRoutedEventBeh
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnDoubleTapped(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnGotFocusBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnGotFocusBehavior.cs
index 761e28a96..09216cb71 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnGotFocusBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnGotFocusBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -19,8 +18,8 @@ static ExecuteCommandOnGotFocusBehavior()
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -31,8 +30,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnGotFocus(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnHoldingBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnHoldingBehavior.cs
index 3cddd3424..497601162 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnHoldingBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnHoldingBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnHoldingBehavior : ExecuteCommandRoutedEventBehavior
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnHolding(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnKeyDownBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnKeyDownBehavior.cs
index 89957a801..36f42cdfa 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnKeyDownBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnKeyDownBehavior.cs
@@ -1,4 +1,4 @@
-using System.Reactive.Disposables;
+using System;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +12,8 @@ public class ExecuteCommandOnKeyDownBehavior : ExecuteCommandOnKeyBehaviorBase
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +24,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnKeyDown(object? sender, KeyEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnKeyUpBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnKeyUpBehavior.cs
index d05ba2a92..4cea247d5 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnKeyUpBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnKeyUpBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnKeyUpBehavior : ExecuteCommandOnKeyBehaviorBase
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnKeyUp(object? sender, KeyEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnLostFocusBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnLostFocusBehavior.cs
index f052c6026..5ca8bbfad 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnLostFocusBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnLostFocusBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -19,8 +18,8 @@ static ExecuteCommandOnLostFocusBehavior()
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -31,8 +30,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnLostFocus(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPinchBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPinchBehavior.cs
index 10cddb3b0..8d85adb96 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPinchBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPinchBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnPinchBehavior : ExecuteCommandRoutedEventBehaviorBa
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnPinch(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPinchEndedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPinchEndedBehavior.cs
index d986f5f8d..fe6021c99 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPinchEndedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPinchEndedBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnPinchEndedBehavior : ExecuteCommandRoutedEventBehav
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnPinchEnded(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerCaptureLostBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerCaptureLostBehavior.cs
index 3e7572d4a..3a48b5123 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerCaptureLostBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerCaptureLostBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnPointerCaptureLostBehavior : ExecuteCommandRoutedEv
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnPointerCaptureLost(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerEnteredBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerEnteredBehavior.cs
index f7616ba13..6ad2c0afa 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerEnteredBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerEnteredBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnPointerEnteredBehavior : ExecuteCommandRoutedEventB
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnPointerEntered(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerExitedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerExitedBehavior.cs
index 69fa96c97..9dd0d8c4e 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerExitedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerExitedBehavior.cs
@@ -1,4 +1,4 @@
-using System.Reactive.Disposables;
+using System;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +12,8 @@ public class ExecuteCommandOnPointerExitedBehavior : ExecuteCommandRoutedEventBe
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +24,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnPointerExited(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerMovedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerMovedBehavior.cs
index d501f1688..3a309b457 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerMovedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerMovedBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnPointerMovedBehavior : ExecuteCommandRoutedEventBeh
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnPointerMoved(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerPressedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerPressedBehavior.cs
index 532eb73a7..29b49e909 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerPressedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerPressedBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnPointerPressedBehavior : ExecuteCommandRoutedEventB
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnPointerPressed(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerReleasedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerReleasedBehavior.cs
index 9c0d4d788..b850102cb 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerReleasedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerReleasedBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnPointerReleasedBehavior : ExecuteCommandRoutedEvent
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnPointerReleased(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerTouchPadGestureMagnifyBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerTouchPadGestureMagnifyBehavior.cs
index b3ac21e91..6c25cfd4c 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerTouchPadGestureMagnifyBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerTouchPadGestureMagnifyBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnPointerTouchPadGestureMagnifyBehavior : ExecuteComm
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnPointerTouchPadGestureMagnify(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerTouchPadGestureRotateBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerTouchPadGestureRotateBehavior.cs
index 25793c3eb..d46d32c2c 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerTouchPadGestureRotateBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerTouchPadGestureRotateBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnPointerTouchPadGestureRotateBehavior : ExecuteComma
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnPointerTouchPadGestureRotate(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerTouchPadGestureSwipeBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerTouchPadGestureSwipeBehavior.cs
index dd4f3492b..afc35c9fc 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerTouchPadGestureSwipeBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerTouchPadGestureSwipeBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnPointerTouchPadGestureSwipeBehavior : ExecuteComman
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnPointerTouchPadGestureSwipe(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerWheelChangedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerWheelChangedBehavior.cs
index 8899b58bf..1e05bd2b9 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerWheelChangedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPointerWheelChangedBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnPointerWheelChangedBehavior : ExecuteCommandRoutedE
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnPointerWheelChanged(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPullGestureBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPullGestureBehavior.cs
index d889c9b4a..5cab58be1 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPullGestureBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPullGestureBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnPullGestureBehavior : ExecuteCommandRoutedEventBeha
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnPullGesture(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPullGestureEndedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPullGestureEndedBehavior.cs
index 5ee641788..740314578 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPullGestureEndedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnPullGestureEndedBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnPullGestureEndedBehavior : ExecuteCommandRoutedEven
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnPullGestureEnded(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnRightTappedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnRightTappedBehavior.cs
index 4d8233c98..02139ba98 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnRightTappedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnRightTappedBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnRightTappedBehavior : ExecuteCommandRoutedEventBeha
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnRightTapped(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnScrollGestureBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnScrollGestureBehavior.cs
index 620a5f4bd..24c0c03dd 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnScrollGestureBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnScrollGestureBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnScrollGestureBehavior : ExecuteCommandRoutedEventBe
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnScrollGesture(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnScrollGestureEndedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnScrollGestureEndedBehavior.cs
index 9bd4f8482..20f7fdc11 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnScrollGestureEndedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnScrollGestureEndedBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnScrollGestureEndedBehavior : ExecuteCommandRoutedEv
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnScrollGestureEnded(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnScrollGestureInertiaStartingBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnScrollGestureInertiaStartingBehavior.cs
index 35d8f8d8e..e6cb5d2f9 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnScrollGestureInertiaStartingBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnScrollGestureInertiaStartingBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnScrollGestureInertiaStartingBehavior : ExecuteComma
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnScrollGestureInertiaStarting(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnTappedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnTappedBehavior.cs
index 95e34e4f0..7c74209c0 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnTappedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnTappedBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnTappedBehavior : ExecuteCommandRoutedEventBehaviorB
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnTapped(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnTextInputBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnTextInputBehavior.cs
index d65e430a0..4cbf44cec 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnTextInputBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnTextInputBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnTextInputBehavior : ExecuteCommandRoutedEventBehavi
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnTextInput(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnTextInputMethodClientRequestedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnTextInputMethodClientRequestedBehavior.cs
index a646321e0..2bd5f4900 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnTextInputMethodClientRequestedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ExecuteCommand/ExecuteCommandOnTextInputMethodClientRequestedBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ExecuteCommandOnTextInputMethodClientRequestedBehavior : ExecuteCom
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var control = SourceControl ?? AssociatedObject;
var dispose = control?
@@ -24,8 +23,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void OnTextInputMethodClientRequested(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Focus/FocusBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Focus/FocusBehavior.cs
index bde09aef3..1857a8433 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Focus/FocusBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Focus/FocusBehavior.cs
@@ -1,7 +1,6 @@
-using System.Reactive;
-using System.Reactive.Disposables;
using Avalonia.Controls;
using Avalonia.Data;
+using Avalonia.Reactive;
using Avalonia.Threading;
namespace Avalonia.Xaml.Interactions.Custom;
@@ -29,30 +28,38 @@ public bool IsFocused
///
///
///
- ///
- protected override void OnAttached(CompositeDisposable disposables)
+ ///
+ protected override System.IDisposable OnAttachedOverride()
{
- if (AssociatedObject is not null)
- {
- disposables.Add(AssociatedObject.GetObservable(Avalonia.Input.InputElement.IsFocusedProperty)
- .Subscribe(new AnonymousObserver(
- focused =>
- {
- if (!focused)
- {
- SetCurrentValue(IsFocusedProperty, false);
- }
- })));
+ if (AssociatedObject is null)
+ {
+ return DisposableAction.Empty;
+ }
- disposables.Add(this.GetObservable(IsFocusedProperty)
- .Subscribe(new AnonymousObserver(
- focused =>
- {
- if (focused)
- {
- Dispatcher.UIThread.Post(() => AssociatedObject?.Focus());
- }
- })));
- }
+ var associatedObjectIsFocusedObservableDispose = AssociatedObject.GetObservable(Avalonia.Input.InputElement.IsFocusedProperty)
+ .Subscribe(new AnonymousObserver(
+ focused =>
+ {
+ if (!focused)
+ {
+ SetCurrentValue(IsFocusedProperty, false);
+ }
+ }));
+
+ var isFocusedObservableDispose = this.GetObservable(IsFocusedProperty)
+ .Subscribe(new AnonymousObserver(
+ focused =>
+ {
+ if (focused)
+ {
+ Dispatcher.UIThread.Post(() => AssociatedObject?.Focus());
+ }
+ }));
+
+ return DisposableAction.Create(() =>
+ {
+ associatedObjectIsFocusedObservableDispose.Dispose();
+ isFocusedObservableDispose.Dispose();
+ });
}
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Focus/FocusControlBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Focus/FocusControlBehavior.cs
index 16f44d322..14a3a7f3e 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Focus/FocusControlBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Focus/FocusControlBehavior.cs
@@ -1,4 +1,4 @@
-using System.Reactive.Disposables;
+using System;
using Avalonia.Controls;
using Avalonia.Threading;
@@ -42,13 +42,14 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs chang
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
if (FocusFlag && IsEnabled)
{
Execute();
}
+
+ return DisposableAction.Empty;
}
private void Execute()
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Focus/FocusOnAttachedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Focus/FocusOnAttachedBehavior.cs
index c684fb80f..cf5f02228 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Focus/FocusOnAttachedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Focus/FocusOnAttachedBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
namespace Avalonia.Xaml.Interactions.Custom;
@@ -10,9 +9,11 @@ public class FocusOnAttachedBehavior : FocusBehaviorBase
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposables)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
Focus();
+
+ return DisposableAction.Empty;
}
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Focus/FocusSelectedItemBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Focus/FocusSelectedItemBehavior.cs
index b8066a276..1e92b33b1 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Focus/FocusSelectedItemBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Focus/FocusSelectedItemBehavior.cs
@@ -1,7 +1,6 @@
-using System;
-using System.Reactive.Disposables;
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
+using Avalonia.Reactive;
using Avalonia.Threading;
namespace Avalonia.Xaml.Interactions.Custom;
@@ -14,30 +13,33 @@ public class FocusSelectedItemBehavior : AttachedToVisualTreeBehavior
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var dispose = AssociatedObject?
.GetObservable(SelectingItemsControl.SelectedItemProperty)
- .Subscribe(selectedItem =>
- {
- var item = selectedItem;
- if (item is not null)
+ .Subscribe(new AnonymousObserver
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
AssociatedObject?.SelectAll();
+
+ return DisposableAction.Empty;
}
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/ListBox/ListBoxUnselectAllBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/ListBox/ListBoxUnselectAllBehavior.cs
index a3cd0c475..049317389 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/ListBox/ListBoxUnselectAllBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/ListBox/ListBoxUnselectAllBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Controls;
namespace Avalonia.Xaml.Interactions.Custom;
@@ -11,9 +10,11 @@ public class ListBoxUnselectAllBehavior : AttachedToVisualTreeBehavior
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
AssociatedObject?.UnselectAll();
+
+ return DisposableAction.Empty;
}
}
diff --git a/src/Avalonia.Xaml.Interactions.Custom/SelectingItemsControl/SelectingItemsControlEventsBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/SelectingItemsControl/SelectingItemsControlEventsBehavior.cs
index a07e5a514..6d085e26d 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/SelectingItemsControl/SelectingItemsControlEventsBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/SelectingItemsControl/SelectingItemsControlEventsBehavior.cs
@@ -1,4 +1,4 @@
-using System.Reactive.Disposables;
+using System;
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
@@ -10,18 +10,17 @@ namespace Avalonia.Xaml.Interactions.Custom;
public abstract class SelectingItemsControlEventsBehavior : DisposingBehavior
{
///
- protected override void OnAttached(CompositeDisposable disposables)
+ protected override IDisposable OnAttachedOverride()
{
if (AssociatedObject is not { } selectingItemsControl)
{
- return;
+ return DisposableAction.Empty;
}
selectingItemsControl.SelectionChanged += SelectingItemsControlOnSelectionChanged;
- disposables.Add(
- Disposable.Create(
- () => selectingItemsControl.SelectionChanged -= SelectingItemsControlOnSelectionChanged));
+ return DisposableAction.Create(
+ () => selectingItemsControl.SelectionChanged -= SelectingItemsControlOnSelectionChanged);
}
private void SelectingItemsControlOnSelectionChanged(object? sender, SelectionChangedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Show/ShowOnDoubleTappedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Show/ShowOnDoubleTappedBehavior.cs
index faa2081c0..99671c49c 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Show/ShowOnDoubleTappedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Show/ShowOnDoubleTappedBehavior.cs
@@ -1,5 +1,4 @@
-using System.Reactive.Disposables;
-using Avalonia.Input;
+using Avalonia.Input;
using Avalonia.Interactivity;
namespace Avalonia.Xaml.Interactions.Custom;
@@ -12,8 +11,8 @@ public class ShowOnDoubleTappedBehavior : ShowBehaviorBase
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var dispose = AssociatedObject?
.AddDisposableHandler(
@@ -23,8 +22,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void AssociatedObject_DoubleTapped(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Show/ShowOnKeyDownBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Show/ShowOnKeyDownBehavior.cs
index e903e0471..afaae001e 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Show/ShowOnKeyDownBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Show/ShowOnKeyDownBehavior.cs
@@ -1,5 +1,4 @@
-using System.Reactive.Disposables;
-using Avalonia.Input;
+using Avalonia.Input;
using Avalonia.Interactivity;
namespace Avalonia.Xaml.Interactions.Custom;
@@ -42,8 +41,8 @@ public KeyGesture? Gesture
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var dispose = AssociatedObject?
.AddDisposableHandler(
@@ -53,8 +52,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void AssociatedObject_KeyDown(object? sender, KeyEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/Show/ShowOnTappedBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/Show/ShowOnTappedBehavior.cs
index b8292e1b1..4f33bd61d 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/Show/ShowOnTappedBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/Show/ShowOnTappedBehavior.cs
@@ -1,4 +1,3 @@
-using System.Reactive.Disposables;
using Avalonia.Input;
using Avalonia.Interactivity;
@@ -12,8 +11,8 @@ public class ShowOnTappedBehavior : ShowBehaviorBase
///
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ ///
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
var dispose = AssociatedObject?
.AddDisposableHandler(
@@ -23,8 +22,10 @@ protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
if (dispose is not null)
{
- disposable.Add(dispose);
+ return dispose;
}
+
+ return DisposableAction.Empty;
}
private void AssociatedObject_Tapped(object? sender, RoutedEventArgs e)
diff --git a/src/Avalonia.Xaml.Interactions.Custom/TextBox/TextBoxSelectAllTextBehavior.cs b/src/Avalonia.Xaml.Interactions.Custom/TextBox/TextBoxSelectAllTextBehavior.cs
index d4b9cfc96..61dd66ad3 100644
--- a/src/Avalonia.Xaml.Interactions.Custom/TextBox/TextBoxSelectAllTextBehavior.cs
+++ b/src/Avalonia.Xaml.Interactions.Custom/TextBox/TextBoxSelectAllTextBehavior.cs
@@ -1,4 +1,4 @@
-using System.Reactive.Disposables;
+using System;
using Avalonia.Controls;
namespace Avalonia.Xaml.Interactions.Custom;
@@ -11,9 +11,10 @@ public class TextBoxSelectAllTextBehavior : AttachedToVisualTreeBehavior
///
///
- ///
- protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
+ protected override System.IDisposable OnAttachedToVisualTreeOverride()
{
AssociatedObject?.SelectAll();
+
+ return DisposableAction.Empty;
}
}
diff --git a/src/Xaml.Behaviors/Xaml.Behaviors.csproj b/src/Xaml.Behaviors/Xaml.Behaviors.csproj
index f70962c76..52e73ee90 100644
--- a/src/Xaml.Behaviors/Xaml.Behaviors.csproj
+++ b/src/Xaml.Behaviors/Xaml.Behaviors.csproj
@@ -18,7 +18,6 @@
-