Browse Source

ContextFlyouts

pull/5682/head
amwx 5 years ago
parent
commit
b1b9f6f7d2
  1. 17
      src/Avalonia.Controls/Control.cs
  2. 36
      src/Avalonia.Controls/Flyouts/FlyoutBase.cs

17
src/Avalonia.Controls/Control.cs

@ -37,9 +37,16 @@ namespace Avalonia.Controls
/// <summary>
/// Defines the <see cref="ContextMenu"/> property.
/// </summary>
[Obsolete("Prefer ContextFlyout")]
public static readonly StyledProperty<ContextMenu?> ContextMenuProperty =
AvaloniaProperty.Register<Control, ContextMenu?>(nameof(ContextMenu));
/// <summary>
/// Defines the <see cref="ContextFlyout"/> property
/// </summary>
public static readonly StyledProperty<FlyoutBase?> ContextFlyoutProperty =
AvaloniaProperty.Register<Control, FlyoutBase?>(nameof(ContextFlyout));
/// <summary>
/// Event raised when an element wishes to be scrolled into view.
/// </summary>
@ -70,12 +77,22 @@ namespace Avalonia.Controls
/// <summary>
/// Gets or sets a context menu to the control.
/// </summary>
[Obsolete("Prefer ContextFlyout")]
public ContextMenu? ContextMenu
{
get => GetValue(ContextMenuProperty);
set => SetValue(ContextMenuProperty, value);
}
/// <summary>
/// Gets or sets a context flyout to the control
/// </summary>
public FlyoutBase? ContextFlyout
{
get => GetValue(ContextFlyoutProperty);
set => SetValue(ContextFlyoutProperty, value);
}
/// <summary>
/// Gets or sets a user-defined object attached to the control.
/// </summary>

36
src/Avalonia.Controls/Flyouts/FlyoutBase.cs

@ -10,6 +10,11 @@ namespace Avalonia.Controls.Primitives
{
public abstract class FlyoutBase : AvaloniaObject
{
static FlyoutBase()
{
Control.ContextFlyoutProperty.Changed.Subscribe(OnContextFlyoutPropertyChanged);
}
private static readonly DirectProperty<FlyoutBase, bool> IsOpenProperty =
AvaloniaProperty.RegisterDirect<FlyoutBase, bool>(nameof(IsOpen),
x => x.IsOpen);
@ -383,5 +388,36 @@ namespace Avalonia.Controls.Primitives
break;
}
}
private static void OnContextFlyoutPropertyChanged(AvaloniaPropertyChangedEventArgs<FlyoutBase> args)
{
if (args.Sender is Control c)
{
if (args.OldValue.GetValueOrDefault() is FlyoutBase)
{
c.PointerReleased -= OnControlWithContextFlyoutPointerReleased;
}
if (args.NewValue.GetValueOrDefault() is FlyoutBase)
{
c.PointerReleased += OnControlWithContextFlyoutPointerReleased;
}
}
}
private static void OnControlWithContextFlyoutPointerReleased(object sender, PointerReleasedEventArgs e)
{
if (sender is Control c)
{
if (e.InitialPressMouseButton == MouseButton.Right &&
e.GetCurrentPoint(c).Properties.PointerUpdateKind == PointerUpdateKind.RightButtonReleased)
{
if (c.ContextFlyout != null)
{
c.ContextFlyout.ShowAt(c, true);
}
}
}
}
}
}

Loading…
Cancel
Save