From b1b9f6f7d2ca93a995a04c583f33e72e53e0a321 Mon Sep 17 00:00:00 2001 From: amwx Date: Thu, 18 Mar 2021 22:39:10 -0500 Subject: [PATCH] ContextFlyouts --- src/Avalonia.Controls/Control.cs | 17 ++++++++++ src/Avalonia.Controls/Flyouts/FlyoutBase.cs | 36 +++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/src/Avalonia.Controls/Control.cs b/src/Avalonia.Controls/Control.cs index 4aab92c428..ebfe98a175 100644 --- a/src/Avalonia.Controls/Control.cs +++ b/src/Avalonia.Controls/Control.cs @@ -37,9 +37,16 @@ namespace Avalonia.Controls /// /// Defines the property. /// + [Obsolete("Prefer ContextFlyout")] public static readonly StyledProperty ContextMenuProperty = AvaloniaProperty.Register(nameof(ContextMenu)); + /// + /// Defines the property + /// + public static readonly StyledProperty ContextFlyoutProperty = + AvaloniaProperty.Register(nameof(ContextFlyout)); + /// /// Event raised when an element wishes to be scrolled into view. /// @@ -70,12 +77,22 @@ namespace Avalonia.Controls /// /// Gets or sets a context menu to the control. /// + [Obsolete("Prefer ContextFlyout")] public ContextMenu? ContextMenu { get => GetValue(ContextMenuProperty); set => SetValue(ContextMenuProperty, value); } + /// + /// Gets or sets a context flyout to the control + /// + public FlyoutBase? ContextFlyout + { + get => GetValue(ContextFlyoutProperty); + set => SetValue(ContextFlyoutProperty, value); + } + /// /// Gets or sets a user-defined object attached to the control. /// diff --git a/src/Avalonia.Controls/Flyouts/FlyoutBase.cs b/src/Avalonia.Controls/Flyouts/FlyoutBase.cs index 85e460a25f..f3f4febbb0 100644 --- a/src/Avalonia.Controls/Flyouts/FlyoutBase.cs +++ b/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 IsOpenProperty = AvaloniaProperty.RegisterDirect(nameof(IsOpen), x => x.IsOpen); @@ -383,5 +388,36 @@ namespace Avalonia.Controls.Primitives break; } } + + private static void OnContextFlyoutPropertyChanged(AvaloniaPropertyChangedEventArgs 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); + } + } + } + + } } }