diff --git a/samples/ControlCatalog/Pages/FlyoutsPage.axaml b/samples/ControlCatalog/Pages/FlyoutsPage.axaml
index 8dbc6d283f..35ece516bd 100644
--- a/samples/ControlCatalog/Pages/FlyoutsPage.axaml
+++ b/samples/ControlCatalog/Pages/FlyoutsPage.axaml
@@ -16,8 +16,13 @@
+
+
+
+
+
-
+
diff --git a/src/Avalonia.Controls/Flyouts/Flyout.cs b/src/Avalonia.Controls/Flyouts/Flyout.cs
index 262edbcc14..c0d3600c1e 100644
--- a/src/Avalonia.Controls/Flyouts/Flyout.cs
+++ b/src/Avalonia.Controls/Flyouts/Flyout.cs
@@ -1,5 +1,7 @@
-using Avalonia.Controls.Primitives;
+using System.ComponentModel;
+using Avalonia.Controls.Primitives;
using Avalonia.Metadata;
+using Avalonia.Styling;
namespace Avalonia.Controls
{
@@ -18,6 +20,21 @@ namespace Avalonia.Controls
private Classes? _classes;
+ ///
+ /// Defines the property.
+ ///
+ public static readonly StyledProperty FlyoutPresenterThemeProperty =
+ AvaloniaProperty.Register(nameof(FlyoutPresenterTheme));
+
+ ///
+ /// Gets or sets the that is applied to the container element generated for the flyout presenter.
+ ///
+ public ControlTheme? FlyoutPresenterTheme
+ {
+ get => GetValue(FlyoutPresenterThemeProperty);
+ set => SetValue(FlyoutPresenterThemeProperty, value);
+ }
+
///
/// Gets or sets the content to display in this flyout
///
@@ -36,13 +53,22 @@ namespace Avalonia.Controls
};
}
- protected override void OnOpened()
+ protected override void OnOpening(CancelEventArgs args)
{
- if (_classes != null)
+ if (Popup.Child is { } presenter)
{
- SetPresenterClasses(Popup.Child, FlyoutPresenterClasses);
+ if (_classes != null)
+ {
+ SetPresenterClasses(presenter, FlyoutPresenterClasses);
+ }
+
+ if (FlyoutPresenterTheme is { } theme)
+ {
+ presenter.SetValue(Control.ThemeProperty, theme);
+ }
}
- base.OnOpened();
+
+ base.OnOpening(args);
}
}
}
diff --git a/src/Avalonia.Controls/Flyouts/MenuFlyout.cs b/src/Avalonia.Controls/Flyouts/MenuFlyout.cs
index 79a6cdb313..df973debc7 100644
--- a/src/Avalonia.Controls/Flyouts/MenuFlyout.cs
+++ b/src/Avalonia.Controls/Flyouts/MenuFlyout.cs
@@ -1,4 +1,5 @@
using System.Collections;
+using System.ComponentModel;
using Avalonia.Collections;
using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates;
@@ -34,6 +35,12 @@ namespace Avalonia.Controls
public static readonly StyledProperty ItemContainerThemeProperty =
ItemsControl.ItemContainerThemeProperty.AddOwner();
+ ///
+ /// Defines the property.
+ ///
+ public static readonly StyledProperty FlyoutPresenterThemeProperty =
+ Flyout.FlyoutPresenterThemeProperty.AddOwner();
+
public Classes FlyoutPresenterClasses => _classes ??= new Classes();
///
@@ -60,10 +67,19 @@ namespace Avalonia.Controls
///
public ControlTheme? ItemContainerTheme
{
- get { return GetValue(ItemContainerThemeProperty); }
- set { SetValue(ItemContainerThemeProperty, value); }
+ get => GetValue(ItemContainerThemeProperty);
+ set => SetValue(ItemContainerThemeProperty, value);
}
+ ///
+ /// Gets or sets the that is applied to the container element generated for the flyout presenter.
+ ///
+ public ControlTheme? FlyoutPresenterTheme
+ {
+ get => GetValue(FlyoutPresenterThemeProperty);
+ set => SetValue(FlyoutPresenterThemeProperty, value);
+ }
+
private Classes? _classes;
private IEnumerable? _items;
private IDataTemplate? _itemTemplate;
@@ -78,13 +94,22 @@ namespace Avalonia.Controls
};
}
- protected override void OnOpened()
+ protected override void OnOpening(CancelEventArgs args)
{
- if (_classes != null)
+ if (Popup.Child is { } presenter)
{
- SetPresenterClasses(Popup.Child, FlyoutPresenterClasses);
+ if (_classes != null)
+ {
+ SetPresenterClasses(presenter, FlyoutPresenterClasses);
+ }
+
+ if (FlyoutPresenterTheme is { } theme)
+ {
+ presenter.SetValue(Control.ThemeProperty, theme);
+ }
}
- base.OnOpened();
+
+ base.OnOpening(args);
}
}
}
diff --git a/src/Avalonia.Controls/Flyouts/PopupFlyoutBase.cs b/src/Avalonia.Controls/Flyouts/PopupFlyoutBase.cs
index 052143622c..f5eb8f4a02 100644
--- a/src/Avalonia.Controls/Flyouts/PopupFlyoutBase.cs
+++ b/src/Avalonia.Controls/Flyouts/PopupFlyoutBase.cs
@@ -37,9 +37,8 @@ namespace Avalonia.Controls.Primitives
///
/// Defines the property
///
- public static readonly DirectProperty ShowModeProperty =
- AvaloniaProperty.RegisterDirect(nameof(ShowMode),
- x => x.ShowMode, (x, v) => x.ShowMode = v);
+ public static readonly StyledProperty ShowModeProperty =
+ AvaloniaProperty.Register(nameof(ShowMode));
///
/// Defines the property
@@ -50,7 +49,6 @@ namespace Avalonia.Controls.Primitives
(o, v) => o._overlayInputPassThroughElement = v);
private readonly Lazy _popupLazy;
- private FlyoutShowMode _showMode = FlyoutShowMode.Standard;
private Rect? _enlargedPopupRect;
private PixelRect? _enlargePopupRectScreenPixelRect;
private IDisposable? _transientDisposable;
@@ -81,39 +79,38 @@ namespace Avalonia.Controls.Primitives
///
public PopupGravity PlacementGravity
{
- get { return GetValue(PlacementGravityProperty); }
- set { SetValue(PlacementGravityProperty, value); }
+ get => GetValue(PlacementGravityProperty);
+ set => SetValue(PlacementGravityProperty, value);
}
///
public PopupAnchor PlacementAnchor
{
- get { return GetValue(PlacementAnchorProperty); }
- set { SetValue(PlacementAnchorProperty, value); }
+ get => GetValue(PlacementAnchorProperty);
+ set => SetValue(PlacementAnchorProperty, value);
}
///
public double HorizontalOffset
{
- get { return GetValue(HorizontalOffsetProperty); }
- set { SetValue(HorizontalOffsetProperty, value); }
+ get => GetValue(HorizontalOffsetProperty);
+ set => SetValue(HorizontalOffsetProperty, value);
}
///
public double VerticalOffset
{
- get { return GetValue(VerticalOffsetProperty); }
- set { SetValue(VerticalOffsetProperty, value); }
+ get => GetValue(VerticalOffsetProperty);
+ set => SetValue(VerticalOffsetProperty, value);
}
-
///
/// Gets or sets the desired ShowMode
///
public FlyoutShowMode ShowMode
{
- get => _showMode;
- set => SetAndRaise(ShowModeProperty, ref _showMode, value);
+ get => GetValue(ShowModeProperty);
+ set => SetValue(ShowModeProperty, value);
}
///