diff --git a/src/Avalonia.Controls/ContextMenu.cs b/src/Avalonia.Controls/ContextMenu.cs
index 92293a32d6..d39cab0284 100644
--- a/src/Avalonia.Controls/ContextMenu.cs
+++ b/src/Avalonia.Controls/ContextMenu.cs
@@ -7,6 +7,7 @@ using Avalonia.Controls.Platform;
using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates;
using Avalonia.Input;
+using Avalonia.Interactivity;
using Avalonia.LogicalTree;
namespace Avalonia.Controls
@@ -90,9 +91,14 @@ namespace Avalonia.Controls
/// The control.
public void Open(Control control)
{
+ if (IsOpen)
+ {
+ return;
+ }
+
if (_popup == null)
{
- _popup = new Popup()
+ _popup = new Popup
{
PlacementMode = PlacementMode.Pointer,
PlacementTarget = control,
@@ -107,7 +113,14 @@ namespace Avalonia.Controls
((ISetLogicalParent)_popup).SetParent(control);
_popup.Child = this;
_popup.IsOpen = true;
+
IsOpen = true;
+
+ RaiseEvent(new RoutedEventArgs
+ {
+ RoutedEvent = MenuOpenedEvent,
+ Source = this,
+ });
}
///
@@ -115,13 +128,15 @@ namespace Avalonia.Controls
///
public override void Close()
{
+ if (!IsOpen)
+ {
+ return;
+ }
+
if (_popup != null && _popup.IsVisible)
{
_popup.IsOpen = false;
}
-
- SelectedIndex = -1;
- IsOpen = false;
}
protected override IItemContainerGenerator CreateItemContainerGenerator()
@@ -129,6 +144,18 @@ namespace Avalonia.Controls
return new MenuItemContainerGenerator(this);
}
+ private void CloseCore()
+ {
+ SelectedIndex = -1;
+ IsOpen = false;
+
+ RaiseEvent(new RoutedEventArgs
+ {
+ RoutedEvent = MenuClosedEvent,
+ Source = this,
+ });
+ }
+
private void PopupOpened(object sender, EventArgs e)
{
Focus();
@@ -145,8 +172,7 @@ namespace Avalonia.Controls
i.IsSubMenuOpen = false;
}
- contextMenu.IsOpen = false;
- contextMenu.SelectedIndex = -1;
+ contextMenu.CloseCore();
}
}
diff --git a/src/Avalonia.Controls/Menu.cs b/src/Avalonia.Controls/Menu.cs
index b0fb3f2b3b..b60a97e1c8 100644
--- a/src/Avalonia.Controls/Menu.cs
+++ b/src/Avalonia.Controls/Menu.cs
@@ -40,37 +40,41 @@ namespace Avalonia.Controls
///
public override void Close()
{
- if (IsOpen)
+ if (!IsOpen)
{
- foreach (var i in ((IMenu)this).SubItems)
- {
- i.Close();
- }
-
- IsOpen = false;
- SelectedIndex = -1;
+ return;
+ }
- RaiseEvent(new RoutedEventArgs
- {
- RoutedEvent = MenuClosedEvent,
- Source = this,
- });
+ foreach (var i in ((IMenu)this).SubItems)
+ {
+ i.Close();
}
+
+ IsOpen = false;
+ SelectedIndex = -1;
+
+ RaiseEvent(new RoutedEventArgs
+ {
+ RoutedEvent = MenuClosedEvent,
+ Source = this,
+ });
}
///
public override void Open()
{
- if (!IsOpen)
+ if (IsOpen)
{
- IsOpen = true;
-
- RaiseEvent(new RoutedEventArgs
- {
- RoutedEvent = MenuOpenedEvent,
- Source = this,
- });
+ return;
}
+
+ IsOpen = true;
+
+ RaiseEvent(new RoutedEventArgs
+ {
+ RoutedEvent = MenuOpenedEvent,
+ Source = this,
+ });
}
///
diff --git a/src/Avalonia.Controls/MenuBase.cs b/src/Avalonia.Controls/MenuBase.cs
index d6eb40360b..aeee685980 100644
--- a/src/Avalonia.Controls/MenuBase.cs
+++ b/src/Avalonia.Controls/MenuBase.cs
@@ -31,13 +31,13 @@ namespace Avalonia.Controls
/// Defines the event.
///
public static readonly RoutedEvent MenuOpenedEvent =
- RoutedEvent.Register