Browse Source

Close menu when clicked outside.

pull/58/head
Steven Kirk 11 years ago
parent
commit
a90a027b53
  1. 30
      Perspex.Controls/Menu.cs
  2. 33
      Perspex.Controls/MenuItem.cs

30
Perspex.Controls/Menu.cs

@ -6,14 +6,19 @@
namespace Perspex.Controls
{
using System;
using System.Linq;
using Perspex.Input;
using Perspex.LogicalTree;
using Perspex.Rendering;
public class Menu : ItemsControl, IMenu
{
private static readonly ItemsPanelTemplate DefaultPanel =
new ItemsPanelTemplate(() => new StackPanel { Orientation = Orientation.Horizontal });
private IDisposable subscription;
static Menu()
{
ItemsPanelProperty.OverrideDefaultValue(typeof(Menu), DefaultPanel);
@ -31,5 +36,30 @@ namespace Perspex.Controls
}
}
}
protected override void OnAttachedToVisualTree(IRenderRoot root)
{
base.OnAttachedToVisualTree(root);
var r = root as IInputElement;
this.subscription = r.AddHandler(
InputElement.PointerPressedEvent,
this.RootPointerPressed,
Interactivity.RoutingStrategies.Tunnel);
}
protected override void OnDetachedFromVisualTree(IRenderRoot oldRoot)
{
base.OnDetachedFromVisualTree(oldRoot);
this.subscription.Dispose();
}
private void RootPointerPressed(object sender, PointerPressEventArgs e)
{
foreach (var i in this.GetLogicalChildren().Cast<MenuItem>())
{
i.IsSubMenuOpen = false;
}
}
}
}

33
Perspex.Controls/MenuItem.cs

@ -6,10 +6,15 @@
namespace Perspex.Controls
{
using System;
using System.Linq;
using System.Windows.Input;
using Perspex.Controls.Primitives;
using Perspex.Input;
using Perspex.LogicalTree;
using System.Windows.Input;
using Perspex.Collections;
using Perspex.Rendering;
using Perspex.Controls.Templates;
public class MenuItem : HeaderedItemsControl
{
@ -25,6 +30,11 @@ namespace Perspex.Controls
public static readonly PerspexProperty<bool> IsSubMenuOpenProperty =
PerspexProperty.Register<MenuItem, bool>("IsSubMenuOpen");
static MenuItem()
{
IsSubMenuOpenProperty.Changed.Subscribe(SubMenuOpenChanged);
}
public ICommand Command
{
get { return this.GetValue(CommandProperty); }
@ -64,5 +74,26 @@ namespace Perspex.Controls
this.IsSubMenuOpen = !this.IsSubMenuOpen;
}
}
private void OnSubMenuOpenChanged(bool open)
{
if (!open && this.Items != null)
{
foreach (var item in this.Items.Cast<object>().OfType<MenuItem>())
{
item.IsSubMenuOpen = false;
}
}
}
private static void SubMenuOpenChanged(PerspexPropertyChangedEventArgs e)
{
var sender = e.Sender as MenuItem;
if (sender != null)
{
sender.OnSubMenuOpenChanged((bool)e.NewValue);
}
}
}
}

Loading…
Cancel
Save