diff --git a/src/AtomUI.Controls/Flyouts/Flyout.cs b/src/AtomUI.Controls/Flyouts/Flyout.cs
index 7a07c9408..7b87aefeb 100644
--- a/src/AtomUI.Controls/Flyouts/Flyout.cs
+++ b/src/AtomUI.Controls/Flyouts/Flyout.cs
@@ -104,7 +104,9 @@ public class Flyout : PopupFlyoutBase
#endregion
private Classes? _classes;
-
+ private CompositeDisposable? _presenterBindingDisposables;
+ private CompositeDisposable? _popupBindingDisposables;
+
///
/// Gets the Classes collection to apply to the FlyoutPresenter this Flyout is hosting
///
@@ -150,12 +152,12 @@ public class Flyout : PopupFlyoutBase
protected override Control CreatePresenter()
{
- var presenter = new FlyoutPresenter
- {
- [!FlyoutPresenter.ContentProperty] = this[!ContentProperty],
- [!FlyoutPresenter.IsMotionEnabledProperty] = this[!IsMotionEnabledProperty],
- [!FlyoutPresenter.IsShowArrowProperty] = this[!IsShowArrowEffectiveProperty],
- };
+ _presenterBindingDisposables?.Dispose();
+ _presenterBindingDisposables = new CompositeDisposable(3);
+ var presenter = new FlyoutPresenter();
+ _presenterBindingDisposables.Add(BindUtils.RelayBind(this, ContentProperty, presenter, FlyoutPresenter.ContentProperty));
+ _presenterBindingDisposables.Add(BindUtils.RelayBind(this, IsMotionEnabledProperty, presenter, FlyoutPresenter.IsMotionEnabledProperty));
+ _presenterBindingDisposables.Add(BindUtils.RelayBind(this, IsShowArrowEffectiveProperty, presenter, FlyoutPresenter.IsShowArrowProperty));
CalculateShowArrowEffective();
SetupArrowPosition(Popup, presenter);
return presenter;
@@ -164,11 +166,13 @@ public class Flyout : PopupFlyoutBase
protected internal override void NotifyPopupCreated(Popup popup)
{
base.NotifyPopupCreated(popup);
- BindUtils.RelayBind(this, PlacementProperty, popup, Popup.PlacementProperty);
- BindUtils.RelayBind(this, PlacementAnchorProperty, popup, Popup.PlacementAnchorProperty);
- BindUtils.RelayBind(this, PlacementGravityProperty, popup, Popup.PlacementGravityProperty);
- BindUtils.RelayBind(this, MaskShadowsProperty, popup, Popup.MaskShadowsProperty);
- BindUtils.RelayBind(this, IsMotionEnabledProperty, popup, Popup.IsMotionEnabledProperty);
+ _popupBindingDisposables?.Dispose();
+ _popupBindingDisposables = new CompositeDisposable(5);
+ _popupBindingDisposables.Add(BindUtils.RelayBind(this, PlacementProperty, popup, Popup.PlacementProperty));
+ _popupBindingDisposables.Add(BindUtils.RelayBind(this, PlacementAnchorProperty, popup, Popup.PlacementAnchorProperty));
+ _popupBindingDisposables.Add(BindUtils.RelayBind(this, PlacementGravityProperty, popup, Popup.PlacementGravityProperty));
+ _popupBindingDisposables.Add(BindUtils.RelayBind(this, MaskShadowsProperty, popup, Popup.MaskShadowsProperty));
+ _popupBindingDisposables.Add(BindUtils.RelayBind(this, IsMotionEnabledProperty, popup, Popup.IsMotionEnabledProperty));
SetupArrowPosition(popup);
}
diff --git a/src/AtomUI.Controls/Flyouts/MenuFlyout.cs b/src/AtomUI.Controls/Flyouts/MenuFlyout.cs
index 8bccd0bfd..f21444965 100644
--- a/src/AtomUI.Controls/Flyouts/MenuFlyout.cs
+++ b/src/AtomUI.Controls/Flyouts/MenuFlyout.cs
@@ -1,5 +1,6 @@
using System.Collections;
using System.ComponentModel;
+using System.Reactive.Disposables;
using AtomUI.Controls.Utils;
using AtomUI.Data;
using Avalonia;
@@ -44,17 +45,17 @@ public class MenuFlyout : Flyout
get => GetValue(ItemTemplateProperty);
set => SetValue(ItemTemplateProperty, value);
}
-
- #endregion
-
- public Func? ClickHideFlyoutPredicate;
-
- private IDisposable? _detectMouseClickDisposable;
- private MenuFlyoutPresenter? _presenter;
[Content]
public ItemCollection Items { get; }
+ public Func? ClickHideFlyoutPredicate;
+ #endregion
+
+ private IDisposable? _detectMouseClickDisposable;
+ private MenuFlyoutPresenter? _presenter;
+ private CompositeDisposable? _presenterBindingDisposables;
+
public MenuFlyout()
{
var itemCollectionType = typeof(ItemCollection);
@@ -63,16 +64,16 @@ public class MenuFlyout : Flyout
protected override Control CreatePresenter()
{
+ _presenterBindingDisposables?.Dispose();
+ _presenterBindingDisposables = new CompositeDisposable(4);
_presenter = new MenuFlyoutPresenter
{
- ItemsSource = Items,
- [!ItemsControl.ItemTemplateProperty] = this[!ItemTemplateProperty],
- [!ItemsControl.ItemContainerThemeProperty] = this[!ItemContainerThemeProperty],
- [!MenuFlyoutPresenter.IsMotionEnabledProperty] = this[!IsMotionEnabledProperty],
- MenuFlyout = this
+ MenuFlyout = this
};
- BindUtils.RelayBind(this, IsShowArrowEffectiveProperty, _presenter, MenuFlyoutPresenter.IsShowArrowProperty);
- BindUtils.RelayBind(this, IsMotionEnabledProperty, _presenter, MenuFlyoutPresenter.IsMotionEnabledProperty);
+ _presenterBindingDisposables.Add(BindUtils.RelayBind(this, ItemTemplateProperty, _presenter, MenuFlyoutPresenter.ItemTemplateProperty));
+ _presenterBindingDisposables.Add(BindUtils.RelayBind(this, ItemContainerThemeProperty, _presenter, MenuFlyoutPresenter.ItemContainerThemeProperty));
+ _presenterBindingDisposables.Add(BindUtils.RelayBind(this, IsShowArrowEffectiveProperty, _presenter, MenuFlyoutPresenter.IsShowArrowProperty));
+ _presenterBindingDisposables.Add(BindUtils.RelayBind(this, IsMotionEnabledProperty, _presenter, MenuFlyoutPresenter.IsMotionEnabledProperty));
SetupArrowPosition(Popup, _presenter);
CalculateShowArrowEffective();
@@ -173,6 +174,7 @@ public class MenuFlyout : Flyout
{
if (_detectMouseClickDisposable is not null)
{
+ _detectMouseClickDisposable.Dispose();
CompositeDisposable?.Remove(_detectMouseClickDisposable);
}
@@ -184,6 +186,7 @@ public class MenuFlyout : Flyout
{
if (_detectMouseClickDisposable is not null)
{
+ _detectMouseClickDisposable.Dispose();
CompositeDisposable?.Remove(_detectMouseClickDisposable);
}
}
diff --git a/src/AtomUI.Controls/Flyouts/MenuFlyoutPresenter.cs b/src/AtomUI.Controls/Flyouts/MenuFlyoutPresenter.cs
index df61f2955..c841ee684 100644
--- a/src/AtomUI.Controls/Flyouts/MenuFlyoutPresenter.cs
+++ b/src/AtomUI.Controls/Flyouts/MenuFlyoutPresenter.cs
@@ -1,4 +1,6 @@
-using System.Diagnostics;
+using System.Collections.Specialized;
+using System.Diagnostics;
+using System.Reactive.Disposables;
using AtomUI.Controls.Themes;
using AtomUI.Data;
using AtomUI.Theme;
@@ -76,17 +78,41 @@ public class MenuFlyoutPresenter : MenuBase,
#endregion
private ArrowDecoratedBox? _arrowDecoratedBox;
+ private Dictionary