From 6496abf14b2419948ad4bd87b5e299f2ab663d62 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Mon, 27 Feb 2023 00:44:15 -0500 Subject: [PATCH] Changes after review, added FlyoutPresenterTheme --- .../ControlCatalog/Pages/FlyoutsPage.axaml | 7 +++- src/Avalonia.Controls/Flyouts/Flyout.cs | 36 +++++++++++++++--- src/Avalonia.Controls/Flyouts/MenuFlyout.cs | 37 ++++++++++++++++--- .../Flyouts/PopupFlyoutBase.cs | 27 ++++++-------- 4 files changed, 80 insertions(+), 27 deletions(-) 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); } ///