Browse Source

Changes after review, added FlyoutPresenterTheme

pull/10492/head
Max Katz 4 years ago
parent
commit
6496abf14b
  1. 7
      samples/ControlCatalog/Pages/FlyoutsPage.axaml
  2. 36
      src/Avalonia.Controls/Flyouts/Flyout.cs
  3. 37
      src/Avalonia.Controls/Flyouts/MenuFlyout.cs
  4. 27
      src/Avalonia.Controls/Flyouts/PopupFlyoutBase.cs

7
samples/ControlCatalog/Pages/FlyoutsPage.axaml

@ -16,8 +16,13 @@
<MenuItem Header="Item 3" /> <MenuItem Header="Item 3" />
</MenuFlyout> </MenuFlyout>
<Flyout Placement="Bottom" x:Key="BasicFlyout"> <Flyout Placement="Bottom" x:Key="BasicFlyout">
<Flyout.FlyoutPresenterTheme>
<ControlTheme TargetType="FlyoutPresenter" BasedOn="{StaticResource {x:Type FlyoutPresenter}}">
<Setter Property="CornerRadius" Value="20" />
</ControlTheme>
</Flyout.FlyoutPresenterTheme>
<Panel Width="100" Height="100"> <Panel Width="100" Height="100">
<TextBlock Text="Flyout Content!" /> <TextBlock Text="Flyout Content with a custom presenter theme!" TextWrapping="Wrap" />
</Panel> </Panel>
</Flyout> </Flyout>
</UserControl.Resources> </UserControl.Resources>

36
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.Metadata;
using Avalonia.Styling;
namespace Avalonia.Controls namespace Avalonia.Controls
{ {
@ -18,6 +20,21 @@ namespace Avalonia.Controls
private Classes? _classes; private Classes? _classes;
/// <summary>
/// Defines the <see cref="FlyoutPresenterTheme"/> property.
/// </summary>
public static readonly StyledProperty<ControlTheme?> FlyoutPresenterThemeProperty =
AvaloniaProperty.Register<Flyout, ControlTheme?>(nameof(FlyoutPresenterTheme));
/// <summary>
/// Gets or sets the <see cref="ControlTheme"/> that is applied to the container element generated for the flyout presenter.
/// </summary>
public ControlTheme? FlyoutPresenterTheme
{
get => GetValue(FlyoutPresenterThemeProperty);
set => SetValue(FlyoutPresenterThemeProperty, value);
}
/// <summary> /// <summary>
/// Gets or sets the content to display in this flyout /// Gets or sets the content to display in this flyout
/// </summary> /// </summary>
@ -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);
} }
} }
} }

37
src/Avalonia.Controls/Flyouts/MenuFlyout.cs

@ -1,4 +1,5 @@
using System.Collections; using System.Collections;
using System.ComponentModel;
using Avalonia.Collections; using Avalonia.Collections;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
@ -34,6 +35,12 @@ namespace Avalonia.Controls
public static readonly StyledProperty<ControlTheme?> ItemContainerThemeProperty = public static readonly StyledProperty<ControlTheme?> ItemContainerThemeProperty =
ItemsControl.ItemContainerThemeProperty.AddOwner<MenuFlyout>(); ItemsControl.ItemContainerThemeProperty.AddOwner<MenuFlyout>();
/// <summary>
/// Defines the <see cref="FlyoutPresenterTheme"/> property.
/// </summary>
public static readonly StyledProperty<ControlTheme?> FlyoutPresenterThemeProperty =
Flyout.FlyoutPresenterThemeProperty.AddOwner<MenuFlyout>();
public Classes FlyoutPresenterClasses => _classes ??= new Classes(); public Classes FlyoutPresenterClasses => _classes ??= new Classes();
/// <summary> /// <summary>
@ -60,10 +67,19 @@ namespace Avalonia.Controls
/// </summary> /// </summary>
public ControlTheme? ItemContainerTheme public ControlTheme? ItemContainerTheme
{ {
get { return GetValue(ItemContainerThemeProperty); } get => GetValue(ItemContainerThemeProperty);
set { SetValue(ItemContainerThemeProperty, value); } set => SetValue(ItemContainerThemeProperty, value);
} }
/// <summary>
/// Gets or sets the <see cref="ControlTheme"/> that is applied to the container element generated for the flyout presenter.
/// </summary>
public ControlTheme? FlyoutPresenterTheme
{
get => GetValue(FlyoutPresenterThemeProperty);
set => SetValue(FlyoutPresenterThemeProperty, value);
}
private Classes? _classes; private Classes? _classes;
private IEnumerable? _items; private IEnumerable? _items;
private IDataTemplate? _itemTemplate; 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);
} }
} }
} }

27
src/Avalonia.Controls/Flyouts/PopupFlyoutBase.cs

@ -37,9 +37,8 @@ namespace Avalonia.Controls.Primitives
/// <summary> /// <summary>
/// Defines the <see cref="ShowMode"/> property /// Defines the <see cref="ShowMode"/> property
/// </summary> /// </summary>
public static readonly DirectProperty<PopupFlyoutBase, FlyoutShowMode> ShowModeProperty = public static readonly StyledProperty<FlyoutShowMode> ShowModeProperty =
AvaloniaProperty.RegisterDirect<PopupFlyoutBase, FlyoutShowMode>(nameof(ShowMode), AvaloniaProperty.Register<PopupFlyoutBase, FlyoutShowMode>(nameof(ShowMode));
x => x.ShowMode, (x, v) => x.ShowMode = v);
/// <summary> /// <summary>
/// Defines the <see cref="OverlayInputPassThroughElement"/> property /// Defines the <see cref="OverlayInputPassThroughElement"/> property
@ -50,7 +49,6 @@ namespace Avalonia.Controls.Primitives
(o, v) => o._overlayInputPassThroughElement = v); (o, v) => o._overlayInputPassThroughElement = v);
private readonly Lazy<Popup> _popupLazy; private readonly Lazy<Popup> _popupLazy;
private FlyoutShowMode _showMode = FlyoutShowMode.Standard;
private Rect? _enlargedPopupRect; private Rect? _enlargedPopupRect;
private PixelRect? _enlargePopupRectScreenPixelRect; private PixelRect? _enlargePopupRectScreenPixelRect;
private IDisposable? _transientDisposable; private IDisposable? _transientDisposable;
@ -81,39 +79,38 @@ namespace Avalonia.Controls.Primitives
/// <inheritdoc cref="Popup.PlacementGravity"/> /// <inheritdoc cref="Popup.PlacementGravity"/>
public PopupGravity PlacementGravity public PopupGravity PlacementGravity
{ {
get { return GetValue(PlacementGravityProperty); } get => GetValue(PlacementGravityProperty);
set { SetValue(PlacementGravityProperty, value); } set => SetValue(PlacementGravityProperty, value);
} }
/// <inheritdoc cref="Popup.PlacementAnchor"/> /// <inheritdoc cref="Popup.PlacementAnchor"/>
public PopupAnchor PlacementAnchor public PopupAnchor PlacementAnchor
{ {
get { return GetValue(PlacementAnchorProperty); } get => GetValue(PlacementAnchorProperty);
set { SetValue(PlacementAnchorProperty, value); } set => SetValue(PlacementAnchorProperty, value);
} }
/// <inheritdoc cref="Popup.HorizontalOffset"/> /// <inheritdoc cref="Popup.HorizontalOffset"/>
public double HorizontalOffset public double HorizontalOffset
{ {
get { return GetValue(HorizontalOffsetProperty); } get => GetValue(HorizontalOffsetProperty);
set { SetValue(HorizontalOffsetProperty, value); } set => SetValue(HorizontalOffsetProperty, value);
} }
/// <inheritdoc cref="Popup.VerticalOffset"/> /// <inheritdoc cref="Popup.VerticalOffset"/>
public double VerticalOffset public double VerticalOffset
{ {
get { return GetValue(VerticalOffsetProperty); } get => GetValue(VerticalOffsetProperty);
set { SetValue(VerticalOffsetProperty, value); } set => SetValue(VerticalOffsetProperty, value);
} }
/// <summary> /// <summary>
/// Gets or sets the desired ShowMode /// Gets or sets the desired ShowMode
/// </summary> /// </summary>
public FlyoutShowMode ShowMode public FlyoutShowMode ShowMode
{ {
get => _showMode; get => GetValue(ShowModeProperty);
set => SetAndRaise(ShowModeProperty, ref _showMode, value); set => SetValue(ShowModeProperty, value);
} }
/// <summary> /// <summary>

Loading…
Cancel
Save