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); customContextRequestedBorder.AddHandler(ContextRequestedEvent, CustomContextRequested, RoutingStrategies.Tunnel);
var cancellableContextBorder = this.Get<Border>("CancellableContextBorder"); var cancellableContextBorder = this.Get<Border>("CancellableContextBorder");
cancellableContextBorder.ContextFlyout!.Closing += ContextFlyoutPage_Closing; var flyout = (Flyout)cancellableContextBorder.ContextFlyout!;
cancellableContextBorder.ContextFlyout!.Opening += ContextFlyoutPage_Opening; flyout.Closing += ContextFlyoutPage_Closing;
flyout.Opening += ContextFlyoutPage_Opening;
} }
private ContextPageViewModel? _model; private ContextPageViewModel? _model;

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

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

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

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

Loading…
Cancel
Save