Browse Source

Close menu when clicked outside.

pull/58/head
Steven Kirk 12 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 namespace Perspex.Controls
{ {
using System;
using System.Linq; using System.Linq;
using Perspex.Input;
using Perspex.LogicalTree; using Perspex.LogicalTree;
using Perspex.Rendering;
public class Menu : ItemsControl, IMenu public class Menu : ItemsControl, IMenu
{ {
private static readonly ItemsPanelTemplate DefaultPanel = private static readonly ItemsPanelTemplate DefaultPanel =
new ItemsPanelTemplate(() => new StackPanel { Orientation = Orientation.Horizontal }); new ItemsPanelTemplate(() => new StackPanel { Orientation = Orientation.Horizontal });
private IDisposable subscription;
static Menu() static Menu()
{ {
ItemsPanelProperty.OverrideDefaultValue(typeof(Menu), DefaultPanel); 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 namespace Perspex.Controls
{ {
using System;
using System.Linq;
using System.Windows.Input;
using Perspex.Controls.Primitives; using Perspex.Controls.Primitives;
using Perspex.Input; using Perspex.Input;
using Perspex.LogicalTree; using Perspex.LogicalTree;
using System.Windows.Input; using Perspex.Collections;
using Perspex.Rendering;
using Perspex.Controls.Templates;
public class MenuItem : HeaderedItemsControl public class MenuItem : HeaderedItemsControl
{ {
@ -25,6 +30,11 @@ namespace Perspex.Controls
public static readonly PerspexProperty<bool> IsSubMenuOpenProperty = public static readonly PerspexProperty<bool> IsSubMenuOpenProperty =
PerspexProperty.Register<MenuItem, bool>("IsSubMenuOpen"); PerspexProperty.Register<MenuItem, bool>("IsSubMenuOpen");
static MenuItem()
{
IsSubMenuOpenProperty.Changed.Subscribe(SubMenuOpenChanged);
}
public ICommand Command public ICommand Command
{ {
get { return this.GetValue(CommandProperty); } get { return this.GetValue(CommandProperty); }
@ -64,5 +74,26 @@ namespace Perspex.Controls
this.IsSubMenuOpen = !this.IsSubMenuOpen; 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