Browse Source

Add some popup properties to the PopupFlyoutBase

pull/10492/head
Max Katz 3 years ago
parent
commit
4e47a27304
  1. 5
      samples/ControlCatalog/Pages/ContextFlyoutPage.xaml.cs
  2. 58
      src/Avalonia.Controls/Flyouts/PopupFlyoutBase.cs
  3. 2
      src/Avalonia.Controls/SplitButton/SplitButton.cs
  4. 12
      src/Avalonia.Diagnostics/Diagnostics/ViewModels/VisualTreeNode.cs

5
samples/ControlCatalog/Pages/ContextFlyoutPage.xaml.cs

@ -36,8 +36,9 @@ namespace ControlCatalog.Pages
customContextRequestedBorder.AddHandler(ContextRequestedEvent, CustomContextRequested, RoutingStrategies.Tunnel);
var cancellableContextBorder = this.Get<Border>("CancellableContextBorder");
cancellableContextBorder.ContextFlyout!.Closing += ContextFlyoutPage_Closing;
cancellableContextBorder.ContextFlyout!.Opening += ContextFlyoutPage_Opening;
var flyout = (Flyout)cancellableContextBorder.ContextFlyout!;
flyout.Closing += ContextFlyoutPage_Closing;
flyout.Opening += ContextFlyoutPage_Opening;
}
private ContextPageViewModel? _model;

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

@ -2,6 +2,7 @@
using System.ComponentModel;
using System.Linq;
using Avalonia.Controls.Diagnostics;
using Avalonia.Controls.Primitives.PopupPositioning;
using Avalonia.Input;
using Avalonia.Input.Platform;
using Avalonia.Input.Raw;
@ -13,11 +14,25 @@ namespace Avalonia.Controls.Primitives
{
public abstract class PopupFlyoutBase : FlyoutBase, IPopupHostProvider
{
/// <summary>
/// Defines the <see cref="Placement"/> property
/// </summary>
/// <inheritdoc cref="Popup.PlacementModeProperty"/>
public static readonly StyledProperty<PlacementMode> PlacementProperty =
AvaloniaProperty.Register<PopupFlyoutBase, PlacementMode>(nameof(Placement));
Popup.PlacementModeProperty.AddOwner<PopupFlyoutBase>();
/// <inheritdoc cref="Popup.HorizontalOffsetProperty"/>
public static readonly StyledProperty<double> HorizontalOffsetProperty =
Popup.HorizontalOffsetProperty.AddOwner<PopupFlyoutBase>();
/// <inheritdoc cref="Popup.VerticalOffsetProperty"/>
public static readonly StyledProperty<double> VerticalOffsetProperty =
Popup.VerticalOffsetProperty.AddOwner<PopupFlyoutBase>();
/// <inheritdoc cref="Popup.PlacementAnchorProperty"/>
public static readonly StyledProperty<PopupAnchor> PlacementAnchorProperty =
Popup.PlacementAnchorProperty.AddOwner<PopupFlyoutBase>();
/// <inheritdoc cref="Popup.PlacementAnchorProperty"/>
public static readonly StyledProperty<PopupGravity> PlacementGravityProperty =
Popup.PlacementGravityProperty.AddOwner<PopupFlyoutBase>();
/// <summary>
/// Defines the <see cref="ShowMode"/> property
@ -55,14 +70,43 @@ namespace Avalonia.Controls.Primitives
protected Popup Popup => _popupLazy.Value;
/// <summary>
/// Gets or sets the desired placement
/// Gets or sets the desired placement.
/// </summary>
public PlacementMode Placement
{
get => GetValue(PlacementProperty);
set => SetValue(PlacementProperty, value);
}
/// <inheritdoc cref="Popup.PlacementGravity"/>
public PopupGravity PlacementGravity
{
get { return GetValue(PlacementGravityProperty); }
set { SetValue(PlacementGravityProperty, value); }
}
/// <inheritdoc cref="Popup.PlacementAnchor"/>
public PopupAnchor PlacementAnchor
{
get { return GetValue(PlacementAnchorProperty); }
set { SetValue(PlacementAnchorProperty, value); }
}
/// <inheritdoc cref="Popup.HorizontalOffset"/>
public double HorizontalOffset
{
get { return GetValue(HorizontalOffsetProperty); }
set { SetValue(HorizontalOffsetProperty, value); }
}
/// <inheritdoc cref="Popup.VerticalOffset"/>
public double VerticalOffset
{
get { return GetValue(VerticalOffsetProperty); }
set { SetValue(VerticalOffsetProperty, value); }
}
/// <summary>
/// Gets or sets the desired ShowMode
/// </summary>
@ -379,6 +423,10 @@ namespace Avalonia.Controls.Primitives
sz = Popup.Child.DesiredSize;
}
Popup.VerticalOffset = VerticalOffset;
Popup.HorizontalOffset = HorizontalOffset;
Popup.PlacementAnchor = PlacementAnchor;
Popup.PlacementGravity = PlacementGravity;
if (showAtPointer)
{
Popup.PlacementMode = PlacementMode.Pointer;

2
src/Avalonia.Controls/SplitButton/SplitButton.cs

@ -176,7 +176,7 @@ namespace Avalonia.Controls
flyout.Opened += Flyout_Opened;
flyout.Closed += Flyout_Closed;
_flyoutPropertyChangedDisposable = flyout.GetPropertyChangedObservable(PopupFlyoutBase.PlacementProperty).Subscribe(Flyout_PlacementPropertyChanged);
_flyoutPropertyChangedDisposable = flyout.GetPropertyChangedObservable(Popup.PlacementModeProperty).Subscribe(Flyout_PlacementPropertyChanged);
}
}

12
src/Avalonia.Diagnostics/Diagnostics/ViewModels/VisualTreeNode.cs

@ -82,7 +82,7 @@ namespace Avalonia.Diagnostics.ViewModels
{
Popup p => GetPopupHostObservable(p),
Control c => Observable.CombineLatest(
new IObservable<IPopupHostProvider?>[]
new IObservable<object?>[]
{
c.GetObservable(Control.ContextFlyoutProperty),
c.GetObservable(Control.ContextMenuProperty),
@ -93,11 +93,11 @@ namespace Avalonia.Diagnostics.ViewModels
.Select(
items =>
{
var contextFlyout = items[0];
var contextMenu = (ContextMenu?)items[1];
var attachedFlyout = items[2];
var toolTip = items[3];
var buttonFlyout = items[4];
var contextFlyout = items[0] as IPopupHostProvider;
var contextMenu = items[1] as ContextMenu;
var attachedFlyout = items[2] as IPopupHostProvider;
var toolTip = items[3] as IPopupHostProvider;
var buttonFlyout = items[4] as IPopupHostProvider;
if (contextMenu != null)
//Note: ContextMenus are special since all the items are added as visual children.

Loading…
Cancel
Save