Browse Source

More work on Menu.

pull/58/head
Steven Kirk 12 years ago
parent
commit
51a4868010
  1. 13
      Perspex.Controls/IMenu.cs
  2. 20
      Perspex.Controls/Menu.cs
  3. 32
      Perspex.Controls/MenuItem.cs
  4. 1
      Perspex.Controls/Perspex.Controls.csproj
  5. 29
      Perspex.Themes.Default/MenuItemStyle.cs
  6. 11
      TestApplication/Program.cs

13
Perspex.Controls/IMenu.cs

@ -0,0 +1,13 @@
// -----------------------------------------------------------------------
// <copyright file="IMenu.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls
{
internal interface IMenu
{
void ChildPointerEnter(MenuItem item);
}
}

20
Perspex.Controls/Menu.cs

@ -4,11 +4,12 @@
// </copyright>
// -----------------------------------------------------------------------
using Perspex.Controls.Generators;
namespace Perspex.Controls
{
public class Menu : ItemsControl
using System.Linq;
using Perspex.LogicalTree;
public class Menu : ItemsControl, IMenu
{
private static readonly ItemsPanelTemplate DefaultPanel =
new ItemsPanelTemplate(() => new StackPanel { Orientation = Orientation.Horizontal });
@ -17,5 +18,18 @@ namespace Perspex.Controls
{
ItemsPanelProperty.OverrideDefaultValue(typeof(Menu), DefaultPanel);
}
void IMenu.ChildPointerEnter(MenuItem item)
{
var children = this.GetLogicalChildren().Cast<MenuItem>();
if (children.Any(x => x.IsSubMenuOpen))
{
foreach (MenuItem i in this.GetLogicalChildren())
{
i.IsSubMenuOpen = i == item;
}
}
}
}
}

32
Perspex.Controls/MenuItem.cs

@ -8,15 +8,35 @@ namespace Perspex.Controls
{
using Perspex.Controls.Primitives;
using Perspex.Input;
using Perspex.LogicalTree;
using System.Windows.Input;
public class MenuItem : HeaderedItemsControl
{
public static readonly PerspexProperty<ICommand> CommandProperty =
Button.CommandProperty.AddOwner<MenuItem>();
public static readonly PerspexProperty<object> CommandParameterProperty =
Button.CommandParameterProperty.AddOwner<MenuItem>();
public static readonly PerspexProperty<object> IconProperty =
PerspexProperty.Register<MenuItem, object>("Icon");
public static readonly PerspexProperty<bool> IsSubMenuOpenProperty =
PerspexProperty.Register<MenuItem, bool>("IsSubMenuOpen");
public ICommand Command
{
get { return this.GetValue(CommandProperty); }
set { this.SetValue(CommandProperty, value); }
}
public object CommandParameter
{
get { return this.GetValue(CommandParameterProperty); }
set { this.SetValue(CommandParameterProperty, value); }
}
public object Icon
{
get { return this.GetValue(IconProperty); }
@ -29,10 +49,20 @@ namespace Perspex.Controls
set { this.SetValue(IsSubMenuOpenProperty, value); }
}
protected override void OnPointerEnter(PointerEventArgs e)
{
base.OnPointerEnter(e);
this.GetLogicalParent<IMenu>()?.ChildPointerEnter(this);
}
protected override void OnPointerPressed(PointerPressEventArgs e)
{
base.OnPointerPressed(e);
this.IsSubMenuOpen = !this.IsSubMenuOpen;
if (!this.Classes.Contains(":empty"))
{
this.IsSubMenuOpen = !this.IsSubMenuOpen;
}
}
}
}

1
Perspex.Controls/Perspex.Controls.csproj

@ -37,6 +37,7 @@
</PropertyGroup>
<ItemGroup>
<Compile Include="Border.cs" />
<Compile Include="IMenu.cs" />
<Compile Include="MenuItem.cs" />
<Compile Include="Menu.cs" />
<Compile Include="Button.cs" />

29
Perspex.Themes.Default/MenuItemStyle.cs

@ -45,6 +45,21 @@ namespace Perspex.Themes.Default
new Setter(Border.BorderBrushProperty, new SolidColorBrush(0xff26a0da)),
},
},
new Style(x => x.OfType<MenuItem>().Class(":empty").Template().Name("rightArrow"))
{
Setters = new[]
{
new Setter(Path.IsVisibleProperty, false),
},
},
new Style(x => x.OfType<MenuItem>().PropertyEquals(MenuItem.IsSubMenuOpenProperty, true).Template().Name("root"))
{
Setters = new[]
{
new Setter(Border.BackgroundProperty, new SolidColorBrush(0x3d26a0da)),
new Setter(Border.BorderBrushProperty, new SolidColorBrush(0xff26a0da)),
},
},
});
}
@ -71,7 +86,7 @@ namespace Perspex.Themes.Default
(popup = new Popup
{
Name = "popup",
StaysOpen = false,
StaysOpen = true,
[!!Popup.IsOpenProperty] = control[!!MenuItem.IsSubMenuOpenProperty],
Child = new Border
{
@ -160,10 +175,20 @@ namespace Perspex.Themes.Default
[~ContentPresenter.MarginProperty] = control[~MenuItem.PaddingProperty],
[Grid.ColumnProperty] = 2,
},
new Path
{
Name = "rightArrow",
Data = StreamGeometry.Parse("M0,0L4,3.5 0,7z"),
Fill = new SolidColorBrush(0xff212121),
Margin = new Thickness(10, 0, 0, 0),
UseLayoutRounding = false,
VerticalAlignment = VerticalAlignment.Center,
[Grid.ColumnProperty] = 3,
},
(popup = new Popup
{
Name = "popup",
StaysOpen = false,
StaysOpen = true,
[!!Popup.IsOpenProperty] = control[!!MenuItem.IsSubMenuOpenProperty],
Child = new Border
{

11
TestApplication/Program.cs

@ -151,6 +151,17 @@ namespace TestApplication
new MenuItem
{
Header = "Save",
Items = new[]
{
new MenuItem
{
Header = "Sub Item 1",
},
new MenuItem
{
Header = "Sub Item 2",
},
}
},
new MenuItem
{

Loading…
Cancel
Save