Browse Source

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,
pull/58/head
Steven Kirk 11 years ago
parent
commit
e1442af783
  1. 2
      Perspex.Controls/IMenu.cs
  2. 10
      Perspex.Controls/Menu.cs
  3. 18
      Perspex.Controls/MenuItem.cs
  4. 11
      TestApplication/Program.cs

2
Perspex.Controls/IMenu.cs

@ -9,5 +9,7 @@ namespace Perspex.Controls
internal interface IMenu
{
void ChildPointerEnter(MenuItem item);
void ChildSubMenuOpened(MenuItem item);
}
}

10
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<MenuItem>())
{
i.IsSubMenuOpen = false;
i.IsSubMenuOpen = false;
}
}
}

18
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<ICommand> CommandProperty =
Button.CommandProperty.AddOwner<MenuItem>();
@ -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<object>().OfType<MenuItem>())
{
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<IMenu>()?.ChildSubMenuOpened(this);
}
}
private static void SubMenuOpenChanged(PerspexPropertyChangedEventArgs e)

11
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
{

Loading…
Cancel
Save