From e1442af78378ea118534ba443c2523cbce0e1c8e Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 27 May 2015 12:05:16 +0200 Subject: [PATCH] Try to make only 1 submenu at a time be opened. Doesn't work as there is currently no logical tree link between MenuItems as they're in Popups. Need to fix this first, --- Perspex.Controls/IMenu.cs | 2 ++ Perspex.Controls/Menu.cs | 10 +++++++++- Perspex.Controls/MenuItem.cs | 18 +++++++++++++++++- TestApplication/Program.cs | 11 +++++++++++ 4 files changed, 39 insertions(+), 2 deletions(-) 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 {