diff --git a/Perspex.Controls/IMenu.cs b/Perspex.Controls/IMenu.cs index 5943007856..47fde58012 100644 --- a/Perspex.Controls/IMenu.cs +++ b/Perspex.Controls/IMenu.cs @@ -9,5 +9,7 @@ namespace Perspex.Controls internal interface IMenu { void ChildPointerEnter(MenuItem item); + + void ChildSubMenuOpened(MenuItem item); } } diff --git a/Perspex.Controls/Menu.cs b/Perspex.Controls/Menu.cs index 19463ca1a0..d346d90151 100644 --- a/Perspex.Controls/Menu.cs +++ b/Perspex.Controls/Menu.cs @@ -37,6 +37,14 @@ namespace Perspex.Controls } } + void IMenu.ChildSubMenuOpened(MenuItem item) + { + foreach (MenuItem i in this.GetLogicalChildren()) + { + i.IsSubMenuOpen = i == item; + } + } + protected override void OnAttachedToVisualTree(IRenderRoot root) { base.OnAttachedToVisualTree(root); @@ -58,7 +66,7 @@ namespace Perspex.Controls { foreach (var i in this.GetLogicalChildren().Cast()) { - i.IsSubMenuOpen = false; + i.IsSubMenuOpen = false; } } } diff --git a/Perspex.Controls/MenuItem.cs b/Perspex.Controls/MenuItem.cs index 66851159aa..8330ff84a5 100644 --- a/Perspex.Controls/MenuItem.cs +++ b/Perspex.Controls/MenuItem.cs @@ -16,7 +16,7 @@ namespace Perspex.Controls using Perspex.Rendering; using Perspex.Controls.Templates; - public class MenuItem : HeaderedItemsControl + public class MenuItem : HeaderedItemsControl, IMenu { public static readonly PerspexProperty CommandProperty = Button.CommandProperty.AddOwner(); @@ -59,6 +59,18 @@ namespace Perspex.Controls set { this.SetValue(IsSubMenuOpenProperty, value); } } + void IMenu.ChildPointerEnter(MenuItem item) + { + } + + void IMenu.ChildSubMenuOpened(MenuItem item) + { + foreach (var i in this.Items.Cast().OfType()) + { + i.IsSubMenuOpen = i == item; + } + } + protected override void OnPointerEnter(PointerEventArgs e) { base.OnPointerEnter(e); @@ -84,6 +96,10 @@ namespace Perspex.Controls item.IsSubMenuOpen = false; } } + else if (open) + { + this.GetLogicalParent()?.ChildSubMenuOpened(this); + } } private static void SubMenuOpenChanged(PerspexPropertyChangedEventArgs e) diff --git a/TestApplication/Program.cs b/TestApplication/Program.cs index c2019547f7..048579d6b6 100644 --- a/TestApplication/Program.cs +++ b/TestApplication/Program.cs @@ -166,6 +166,17 @@ namespace TestApplication new MenuItem { Header = "Save As", + Items = new[] + { + new MenuItem + { + Header = "Sub Item 1", + }, + new MenuItem + { + Header = "Sub Item 2", + }, + } }, new MenuItem {