Browse Source

Merge pull request #1891 from AvaloniaUI/demo/dynamic-menus

Better support dynamic menus
pull/1895/head
Jeremy Koritzinsky 8 years ago
committed by GitHub
parent
commit
78b8ee0d4c
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 9
      samples/ControlCatalog/App.xaml
  2. 59
      samples/ControlCatalog/Pages/MenuPage.xaml
  3. 38
      samples/ControlCatalog/Pages/MenuPage.xaml.cs
  4. 20
      src/Avalonia.Controls/MenuItem.cs
  5. 12
      src/Avalonia.Themes.Default/MenuItem.xaml

9
samples/ControlCatalog/App.xaml

@ -14,6 +14,11 @@
<Setter Property="FontSize" Value="13"/> <Setter Property="FontSize" Value="13"/>
</Style> </Style>
<StyleInclude Source="resm:ControlCatalog.SideBar.xaml"/> <Style Selector="TextBlock.h3">
<Setter Property="Foreground" Value="#a2a2a2"/>
<Setter Property="FontSize" Value="13"/>
</Style>
<StyleInclude Source="resm:ControlCatalog.SideBar.xaml"/>
</Application.Styles> </Application.Styles>
</Application> </Application>

59
samples/ControlCatalog/Pages/MenuPage.xaml

@ -7,29 +7,44 @@
Margin="0,16,0,0" Margin="0,16,0,0"
HorizontalAlignment="Center" HorizontalAlignment="Center"
Spacing="16"> Spacing="16">
<Menu> <StackPanel>
<MenuItem Header="_First"> <TextBlock Classes="h3" Margin="4 8">Defined in XAML</TextBlock>
<MenuItem Header="Standard _Menu Item"/> <Menu>
<Separator/> <MenuItem Header="_First">
<MenuItem Header="Menu with _Submenu"> <MenuItem Header="Standard _Menu Item"/>
<MenuItem Header="Submenu _1"/> <Separator/>
<MenuItem Header="Submenu _2"/> <MenuItem Header="Menu with _Submenu">
<MenuItem Header="Submenu _1"/>
<MenuItem Header="Submenu _2"/>
</MenuItem>
<MenuItem Header="Menu Item with _Icon">
<MenuItem.Icon>
<Image Source="resm:ControlCatalog.Assets.github_icon.png"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Menu Item with _Checkbox">
<MenuItem.Icon>
<CheckBox BorderThickness="0" IsHitTestVisible="False" IsChecked="True"/>
</MenuItem.Icon>
</MenuItem>
</MenuItem> </MenuItem>
<MenuItem Header="Menu Item with _Icon"> <MenuItem Header="_Second">
<MenuItem.Icon> <MenuItem Header="Second _Menu Item"/>
<Image Source="resm:ControlCatalog.Assets.github_icon.png"/>
</MenuItem.Icon>
</MenuItem> </MenuItem>
<MenuItem Header="Menu Item with _Checkbox"> </Menu>
<MenuItem.Icon> </StackPanel>
<CheckBox BorderThickness="0" IsHitTestVisible="False" IsChecked="True"/>
</MenuItem.Icon> <StackPanel>
</MenuItem> <TextBlock Classes="h3" Margin="4 8">Dyanamically generated</TextBlock>
</MenuItem> <Menu Items="{Binding}">
<MenuItem Header="_Second"> <Menu.Styles>
<MenuItem Header="Second _Menu Item"/> <Style Selector="MenuItem">
</MenuItem> <Setter Property="Header" Value="{Binding Header}"/>
</Menu> <Setter Property="Items" Value="{Binding Items}"/>
</Style>
</Menu.Styles>
</Menu>
</StackPanel>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
</UserControl> </UserControl>

38
samples/ControlCatalog/Pages/MenuPage.xaml.cs

@ -1,3 +1,4 @@
using System.Collections.Generic;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
@ -8,6 +9,37 @@ namespace ControlCatalog.Pages
public MenuPage() public MenuPage()
{ {
this.InitializeComponent(); this.InitializeComponent();
DataContext = new[]
{
new MenuItemViewModel
{
Header = "_File",
Items = new[]
{
new MenuItemViewModel { Header = "_Open..." },
new MenuItemViewModel { Header = "Save" },
new MenuItemViewModel { Header = "-" },
new MenuItemViewModel
{
Header = "Recent",
Items = new[]
{
new MenuItemViewModel { Header = "File1.txt" },
new MenuItemViewModel { Header = "File2.txt" },
}
},
}
},
new MenuItemViewModel
{
Header = "_Edit",
Items = new[]
{
new MenuItemViewModel { Header = "_Copy" },
new MenuItemViewModel { Header = "_Paste" },
}
}
};
} }
private void InitializeComponent() private void InitializeComponent()
@ -15,4 +47,10 @@ namespace ControlCatalog.Pages
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
} }
} }
public class MenuItemViewModel
{
public string Header { get; set; }
public IList<MenuItemViewModel> Items { get; set; }
}
} }

20
src/Avalonia.Controls/MenuItem.cs

@ -105,6 +105,7 @@ namespace Avalonia.Controls
ClickEvent.AddClassHandler<MenuItem>(x => x.OnClick); ClickEvent.AddClassHandler<MenuItem>(x => x.OnClick);
SubmenuOpenedEvent.AddClassHandler<MenuItem>(x => x.OnSubmenuOpened); SubmenuOpenedEvent.AddClassHandler<MenuItem>(x => x.OnSubmenuOpened);
IsSubMenuOpenProperty.Changed.AddClassHandler<MenuItem>(x => x.SubMenuOpenChanged); IsSubMenuOpenProperty.Changed.AddClassHandler<MenuItem>(x => x.SubMenuOpenChanged);
PseudoClass<MenuItem, object>(HeaderProperty, x => x as string == "-", ":separator");
} }
public MenuItem() public MenuItem()
@ -357,10 +358,21 @@ namespace Avalonia.Controls
{ {
base.OnTemplateApplied(e); base.OnTemplateApplied(e);
_popup = e.NameScope.Get<Popup>("PART_Popup"); if (_popup != null)
_popup.DependencyResolver = DependencyResolver.Instance; {
_popup.Opened += PopupOpened; _popup.Opened -= PopupOpened;
_popup.Closed += PopupClosed; _popup.Closed -= PopupClosed;
_popup.DependencyResolver = null;
}
_popup = e.NameScope.Find<Popup>("PART_Popup");
if (_popup != null)
{
_popup.DependencyResolver = DependencyResolver.Instance;
_popup.Opened += PopupOpened;
_popup.Closed += PopupClosed;
}
} }
/// <summary> /// <summary>

12
src/Avalonia.Themes.Default/MenuItem.xaml

@ -73,7 +73,17 @@
</ControlTemplate> </ControlTemplate>
</Setter> </Setter>
</Style> </Style>
<Style Selector="MenuItem:separator">
<Setter Property="Template">
<ControlTemplate>
<Separator Background="{DynamicResource ThemeControlMidBrush}"
Margin="29,1,0,1"
Height="1"/>
</ControlTemplate>
</Setter>
</Style>
<Style Selector="Menu > MenuItem"> <Style Selector="Menu > MenuItem">
<Setter Property="Template"> <Setter Property="Template">
<ControlTemplate> <ControlTemplate>

Loading…
Cancel
Save