diff --git a/src/Avalonia.Controls/Flyouts/FlyoutBase.cs b/src/Avalonia.Controls/Flyouts/FlyoutBase.cs
index a0f3407b7a..bf938abc79 100644
--- a/src/Avalonia.Controls/Flyouts/FlyoutBase.cs
+++ b/src/Avalonia.Controls/Flyouts/FlyoutBase.cs
@@ -16,8 +16,8 @@ namespace Avalonia.Controls.Primitives
/// Defines the property
///
public static readonly DirectProperty IsOpenProperty =
- AvaloniaProperty.RegisterDirect(nameof(IsOpen),
- x => x.IsOpen);
+ AvaloniaProperty.RegisterDirect(nameof(IsOpen),
+ x => x.IsOpen);
///
/// Defines the property
@@ -39,16 +39,18 @@ namespace Avalonia.Controls.Primitives
x => x.ShowMode, (x, v) => x.ShowMode = v);
///
- /// Defines the AttachedFlyout property
+ /// Defines the property
///
- public static readonly AttachedProperty AttachedFlyoutProperty =
- AvaloniaProperty.RegisterAttached("AttachedFlyout", null);
+ public static readonly DirectProperty OverlayInputPassThroughElementProperty =
+ Popup.OverlayInputPassThroughElementProperty.AddOwner(
+ o => o._overlayInputPassThroughElement,
+ (o, v) => o._overlayInputPassThroughElement = v);
///
- /// Defines the OverlayDismissEventPassThrough property
+ /// Defines the AttachedFlyout property
///
- public static readonly StyledProperty OverlayDismissEventPassThroughProperty =
- Popup.OverlayDismissEventPassThroughProperty.AddOwner();
+ public static readonly AttachedProperty AttachedFlyoutProperty =
+ AvaloniaProperty.RegisterAttached("AttachedFlyout", null);
private readonly Lazy _popupLazy;
private bool _isOpen;
@@ -58,10 +60,10 @@ namespace Avalonia.Controls.Primitives
private PixelRect? _enlargePopupRectScreenPixelRect;
private IDisposable? _transientDisposable;
private Action? _popupHostChangedHandler;
+ private IInputElement? _overlayInputPassThroughElement;
static FlyoutBase()
{
- OverlayDismissEventPassThroughProperty.OverrideDefaultValue(true);
Control.ContextFlyoutProperty.Changed.Subscribe(OnContextFlyoutPropertyChanged);
}
@@ -109,25 +111,20 @@ namespace Avalonia.Controls.Primitives
}
///
- /// Gets or sets a value indicating whether the event that closes the flyout is passed
- /// through to the parent window.
+ /// Gets or sets an element that should receive pointer input events even when underneath
+ /// the flyout's overlay.
///
- ///
- /// Clicks outside the the flyout cause the flyout to close. When is set to
- /// false, these clicks will be handled by the flyout and not be registered by the parent
- /// window. When set to true, the events will be passed through to the parent window.
- ///
- public bool OverlayDismissEventPassThrough
+ public IInputElement? OverlayInputPassThroughElement
{
- get => GetValue(OverlayDismissEventPassThroughProperty);
- set => SetValue(OverlayDismissEventPassThroughProperty, value);
+ get => _overlayInputPassThroughElement;
+ set => SetAndRaise(OverlayInputPassThroughElementProperty, ref _overlayInputPassThroughElement, value);
}
IPopupHost? IPopupHostProvider.PopupHost => Popup?.Host;
- event Action? IPopupHostProvider.PopupHostChanged
- {
- add => _popupHostChangedHandler += value;
+ event Action? IPopupHostProvider.PopupHostChanged
+ {
+ add => _popupHostChangedHandler += value;
remove => _popupHostChangedHandler -= value;
}
@@ -200,7 +197,7 @@ namespace Avalonia.Controls.Primitives
Popup.OverlayInputPassThroughElement = null;
((ISetLogicalParent)Popup).SetParent(null);
-
+
// Ensure this isn't active
_transientDisposable?.Dispose();
_transientDisposable = null;
@@ -255,8 +252,7 @@ namespace Avalonia.Controls.Primitives
Popup.Child = CreatePresenter();
}
- Popup.OverlayInputPassThroughElement = placementTarget;
- Popup.OverlayDismissEventPassThrough = OverlayDismissEventPassThrough;
+ Popup.OverlayInputPassThroughElement = OverlayInputPassThroughElement;
if (CancelOpening())
{
@@ -386,7 +382,9 @@ namespace Avalonia.Controls.Primitives
var popup = new Popup
{
WindowManagerAddShadowHint = false,
- IsLightDismissEnabled = true
+ IsLightDismissEnabled = true,
+ //Note: This is required to prevent Button.Flyout from opening the flyout again after dismiss.
+ OverlayDismissEventPassThrough = false
};
popup.Opened += OnPopupOpened;