Browse Source

Merge branch 'master' into api-diff

api-diff-demo
danwalmsley 6 years ago
committed by GitHub
parent
commit
54caeeccd2
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 31
      samples/ControlCatalog/Pages/MenuPage.xaml
  2. 36
      samples/ControlCatalog/ViewModels/MenuPageViewModel.cs
  3. 6
      src/Avalonia.Themes.Fluent/Menu.xaml
  4. 184
      src/Avalonia.Themes.Fluent/MenuItem.xaml

31
samples/ControlCatalog/Pages/MenuPage.xaml

@ -20,7 +20,9 @@
<Separator/> <Separator/>
<MenuItem Header="Menu with _Submenu"> <MenuItem Header="Menu with _Submenu">
<MenuItem Header="Submenu _1"/> <MenuItem Header="Submenu _1"/>
<MenuItem Header="Submenu _2"/> <MenuItem Header="Submenu _2 with Submenu">
<MenuItem Header="Submenu Level 2" />
</MenuItem>
</MenuItem> </MenuItem>
<MenuItem Header="Menu Item with _Icon" InputGesture="Ctrl+Shift+B"> <MenuItem Header="Menu Item with _Icon" InputGesture="Ctrl+Shift+B">
<MenuItem.Icon> <MenuItem.Icon>
@ -52,6 +54,33 @@
</Menu.Styles> </Menu.Styles>
</Menu> </Menu>
</StackPanel> </StackPanel>
<StackPanel>
<TextBlock Classes="h3" Margin="4 8">Mixed</TextBlock>
<Menu>
<MenuItem Header="_File">
<MenuItem Header="_New" CommandParameter="{Binding}" InputGesture="Ctrl+N"/>
<Separator/>
<MenuItem Header="_Open..." InputGesture="Ctrl+O"/>
<Separator/>
<MenuItem Header="Execu_te Script..." />
<Separator/>
<MenuItem Header="_Recent" Items="{Binding RecentItems}">
<MenuItem.Styles>
<Style Selector="MenuItem">
<Setter Property="Header" Value="{Binding Header}"/>
</Style>
</MenuItem.Styles>
</MenuItem>
<Separator/>
<MenuItem Header="E_xit" InputGesture="Alt+F4"/>
</MenuItem>
<MenuItem Header="_Help">
<MenuItem Header="_About"/>
</MenuItem>
</Menu>
</StackPanel>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
</UserControl> </UserControl>

36
samples/ControlCatalog/ViewModels/MenuPageViewModel.cs

@ -17,6 +17,23 @@ namespace ControlCatalog.ViewModels
SaveCommand = ReactiveCommand.Create(Save, Observable.Return(false)); SaveCommand = ReactiveCommand.Create(Save, Observable.Return(false));
OpenRecentCommand = ReactiveCommand.Create<string>(OpenRecent); OpenRecentCommand = ReactiveCommand.Create<string>(OpenRecent);
var recentItems = new[]
{
new MenuItemViewModel
{
Header = "File1.txt",
Command = OpenRecentCommand,
CommandParameter = @"c:\foo\File1.txt"
},
new MenuItemViewModel
{
Header = "File2.txt",
Command = OpenRecentCommand,
CommandParameter = @"c:\foo\File2.txt"
},
};
RecentItems = recentItems;
MenuItems = new[] MenuItems = new[]
{ {
new MenuItemViewModel new MenuItemViewModel
@ -24,27 +41,13 @@ namespace ControlCatalog.ViewModels
Header = "_File", Header = "_File",
Items = new[] Items = new[]
{ {
new MenuItemViewModel { Header = "_Open...", Command = OpenCommand }, new MenuItemViewModel { Header = "O_pen...", Command = OpenCommand },
new MenuItemViewModel { Header = "Save", Command = SaveCommand }, new MenuItemViewModel { Header = "Save", Command = SaveCommand },
new MenuItemViewModel { Header = "-" }, new MenuItemViewModel { Header = "-" },
new MenuItemViewModel new MenuItemViewModel
{ {
Header = "Recent", Header = "Recent",
Items = new[] Items = recentItems
{
new MenuItemViewModel
{
Header = "File1.txt",
Command = OpenRecentCommand,
CommandParameter = @"c:\foo\File1.txt"
},
new MenuItemViewModel
{
Header = "File2.txt",
Command = OpenRecentCommand,
CommandParameter = @"c:\foo\File2.txt"
},
}
}, },
} }
}, },
@ -61,6 +64,7 @@ namespace ControlCatalog.ViewModels
} }
public IReadOnlyList<MenuItemViewModel> MenuItems { get; set; } public IReadOnlyList<MenuItemViewModel> MenuItems { get; set; }
public IReadOnlyList<MenuItemViewModel> RecentItems { get; set; }
public ReactiveCommand<Unit, Unit> OpenCommand { get; } public ReactiveCommand<Unit, Unit> OpenCommand { get; }
public ReactiveCommand<Unit, Unit> SaveCommand { get; } public ReactiveCommand<Unit, Unit> SaveCommand { get; }
public ReactiveCommand<string, Unit> OpenRecentCommand { get; } public ReactiveCommand<string, Unit> OpenRecentCommand { get; }

6
src/Avalonia.Themes.Fluent/Menu.xaml

@ -11,10 +11,12 @@
</Design.PreviewWith> </Design.PreviewWith>
<Style.Resources> <Style.Resources>
<x:Double x:Key="MenuHeight">32</x:Double> <x:Double x:Key="MenuBarHeight">32</x:Double>
<Thickness x:Key="MenuBarItemPadding">12,0,12,0</Thickness>
</Style.Resources> </Style.Resources>
<Setter Property="Background" Value="Transparent" /> <Setter Property="Background" Value="Transparent" />
<Setter Property="Height" Value="{StaticResource MenuHeight}" /> <Setter Property="Height" Value="{StaticResource MenuBarHeight}" />
<Setter Property="Template"> <Setter Property="Template">
<ControlTemplate> <ControlTemplate>
<Border Background="{TemplateBinding Background}" <Border Background="{TemplateBinding Background}"

184
src/Avalonia.Themes.Fluent/MenuItem.xaml

@ -25,11 +25,12 @@
</MenuItem> </MenuItem>
<MenuItem Header="Edit"> <MenuItem Header="Edit">
<MenuItem Header="Go To"> <MenuItem Header="Go To">
<MenuItem Header="Go To Line"/> <MenuItem Header="Go To Line" />
</MenuItem> </MenuItem>
</MenuItem> </MenuItem>
<MenuItem Header="View"> <MenuItem Header="View">
<MenuItem Header="Designer" InputGesture="Shift+F7" /> <MenuItem Header="Designer"
InputGesture="Shift+F7" />
</MenuItem> </MenuItem>
<MenuItem Header="Project"> <MenuItem Header="Project">
<MenuItem Header="Add class" /> <MenuItem Header="Add class" />
@ -40,9 +41,10 @@
<Styles.Resources> <Styles.Resources>
<conv:PlatformKeyGestureConverter x:Key="KeyGestureConverter" /> <conv:PlatformKeyGestureConverter x:Key="KeyGestureConverter" />
<x:Double x:Key="MenuFlyoutSubItemPopupHorizontalOffset">-4</x:Double>
<Thickness x:Key="MenuFlyoutScrollerMargin">0,4,0,4</Thickness> <Thickness x:Key="MenuFlyoutScrollerMargin">0,4,0,4</Thickness>
<Thickness x:Key="MenuIconPresenterMargin">0,0,12,0</Thickness> <Thickness x:Key="MenuIconPresenterMargin">0,0,12,0</Thickness>
<Thickness x:Key="MenuInputGestureTextMargin">24,0,0,0</Thickness> <Thickness x:Key="MenuInputGestureTextMargin">24,0,0,0</Thickness>
<StreamGeometry x:Key="MenuItemChevronPathData">M 1,0 10,10 l -9,10 -1,-1 L 8,10 -0,1 Z</StreamGeometry> <StreamGeometry x:Key="MenuItemChevronPathData">M 1,0 10,10 l -9,10 -1,-1 L 8,10 -0,1 Z</StreamGeometry>
</Styles.Resources> </Styles.Resources>
@ -54,83 +56,84 @@
<Setter Property="FontSize" Value="{DynamicResource ControlContentThemeFontSize}" /> <Setter Property="FontSize" Value="{DynamicResource ControlContentThemeFontSize}" />
<Setter Property="Template"> <Setter Property="Template">
<ControlTemplate> <ControlTemplate>
<Border Name="PART_LayoutRoot" <Panel>
Padding="{TemplateBinding Padding}" <Border Name="PART_LayoutRoot"
Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}"
BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}"
BorderThickness="{TemplateBinding BorderThickness}"> BorderBrush="{TemplateBinding BorderBrush}"
<Grid> BorderThickness="{TemplateBinding BorderThickness}">
<Grid.ColumnDefinitions> <Grid>
<ColumnDefinition Width="Auto" <Grid.ColumnDefinitions>
SharedSizeGroup="MenuItemIcon" /> <ColumnDefinition Width="Auto"
<ColumnDefinition Width="*" /> SharedSizeGroup="MenuItemIcon" />
<ColumnDefinition Width="Auto" <ColumnDefinition Width="*" />
SharedSizeGroup="MenuItemIGT" /> <ColumnDefinition Width="Auto"
<ColumnDefinition Width="Auto" SharedSizeGroup="MenuItemIGT" />
SharedSizeGroup="MenuItemChevron" /> <ColumnDefinition Width="Auto"
</Grid.ColumnDefinitions> SharedSizeGroup="MenuItemChevron" />
<ContentPresenter Name="PART_IconPresenter" </Grid.ColumnDefinitions>
Content="{TemplateBinding Icon}" <ContentPresenter Name="PART_IconPresenter"
Width="16" Content="{TemplateBinding Icon}"
Height="16" Width="16"
Margin="{DynamicResource MenuIconPresenterMargin}" Height="16"
HorizontalAlignment="Center" Margin="{DynamicResource MenuIconPresenterMargin}"
VerticalAlignment="Center"/> HorizontalAlignment="Center"
VerticalAlignment="Center" />
<ContentPresenter Name="PART_HeaderPresenter" <ContentPresenter Name="PART_HeaderPresenter"
Content="{TemplateBinding Header}" Content="{TemplateBinding Header}"
VerticalAlignment="Center" VerticalAlignment="Center"
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
TextBlock.Foreground="{TemplateBinding Foreground}" TextBlock.Foreground="{TemplateBinding Foreground}"
Grid.Column="1"> Grid.Column="1">
<ContentPresenter.DataTemplates> <ContentPresenter.DataTemplates>
<DataTemplate DataType="sys:String"> <DataTemplate DataType="sys:String">
<AccessText Text="{Binding}" /> <AccessText Text="{Binding}" />
</DataTemplate> </DataTemplate>
</ContentPresenter.DataTemplates> </ContentPresenter.DataTemplates>
</ContentPresenter> </ContentPresenter>
<TextBlock x:Name="PART_InputGestureText" <TextBlock x:Name="PART_InputGestureText"
Grid.Column="2" Grid.Column="2"
Classes="CaptionTextBlockStyle" Classes="CaptionTextBlockStyle"
Margin="{DynamicResource MenuInputGestureTextMargin}" Margin="{DynamicResource MenuInputGestureTextMargin}"
Text="{TemplateBinding InputGesture, Text="{TemplateBinding InputGesture, Converter={StaticResource KeyGestureConverter}}"
Converter={StaticResource KeyGestureConverter}}" HorizontalAlignment="Right"
HorizontalAlignment="Right" VerticalAlignment="Center" />
VerticalAlignment="Center" /> <Path Name="PART_ChevronPath"
<Path Name="PART_ChevronPath" Stretch="Uniform"
Stretch="Uniform" Width="8"
Width="8" Height="16"
Height="16" Data="{StaticResource MenuItemChevronPathData}"
Data="{StaticResource MenuItemChevronPathData}" Margin="{DynamicResource MenuFlyoutItemChevronMargin}"
Margin="{DynamicResource MenuFlyoutItemChevronMargin}" VerticalAlignment="Center"
VerticalAlignment="Center" Grid.Column="3" />
Grid.Column="3" /> </Grid>
<Popup Name="PART_Popup" </Border>
WindowManagerAddShadowHint="True" <Popup Name="PART_Popup"
PlacementMode="Right" WindowManagerAddShadowHint="True"
StaysOpen="True" PlacementMode="Right"
IsOpen="{TemplateBinding IsSubMenuOpen, HorizontalOffset="{StaticResource MenuFlyoutSubItemPopupHorizontalOffset}"
Mode=TwoWay}"> StaysOpen="True"
<Border Background="{DynamicResource MenuFlyoutPresenterBackground}" IsOpen="{TemplateBinding IsSubMenuOpen, Mode=TwoWay}">
BorderBrush="{DynamicResource MenuFlyoutPresenterBorderBrush}" <Border Background="{DynamicResource MenuFlyoutPresenterBackground}"
BorderThickness="{DynamicResource MenuFlyoutPresenterBorderThemeThickness}" BorderBrush="{DynamicResource MenuFlyoutPresenterBorderBrush}"
Padding="{DynamicResource MenuFlyoutPresenterThemePadding}" BorderThickness="{DynamicResource MenuFlyoutPresenterBorderThemeThickness}"
MaxWidth="{DynamicResource FlyoutThemeMaxWidth}" Padding="{DynamicResource MenuFlyoutPresenterThemePadding}"
MinHeight="{DynamicResource MenuFlyoutThemeMinHeight}" MaxWidth="{DynamicResource FlyoutThemeMaxWidth}"
HorizontalAlignment="Stretch" MinHeight="{DynamicResource MenuFlyoutThemeMinHeight}"
CornerRadius="{DynamicResource OverlayCornerRadius}"> HorizontalAlignment="Stretch"
<ScrollViewer> CornerRadius="{DynamicResource OverlayCornerRadius}">
<ItemsPresenter Name="PART_ItemsPresenter" <ScrollViewer>
Items="{TemplateBinding Items}" <ItemsPresenter Name="PART_ItemsPresenter"
ItemsPanel="{TemplateBinding ItemsPanel}" Items="{TemplateBinding Items}"
ItemTemplate="{TemplateBinding ItemTemplate}" ItemsPanel="{TemplateBinding ItemsPanel}"
Margin="{DynamicResource MenuFlyoutScrollerMargin}" ItemTemplate="{TemplateBinding ItemTemplate}"
Grid.IsSharedSizeScope="True" /> Margin="{DynamicResource MenuFlyoutScrollerMargin}"
</ScrollViewer> Grid.IsSharedSizeScope="True" />
</Border> </ScrollViewer>
</Popup> </Border>
</Grid> </Popup>
</Border> </Panel>
</ControlTemplate> </ControlTemplate>
</Setter> </Setter>
</Style> </Style>
@ -145,6 +148,8 @@
<Panel> <Panel>
<ContentPresenter Name="PART_HeaderPresenter" <ContentPresenter Name="PART_HeaderPresenter"
Content="{TemplateBinding Header}" Content="{TemplateBinding Header}"
VerticalAlignment="Center"
HorizontalAlignment="Stretch"
Margin="{TemplateBinding Padding}"> Margin="{TemplateBinding Padding}">
<ContentPresenter.DataTemplates> <ContentPresenter.DataTemplates>
<DataTemplate DataType="sys:String"> <DataTemplate DataType="sys:String">
@ -155,8 +160,7 @@
<Popup Name="PART_Popup" <Popup Name="PART_Popup"
WindowManagerAddShadowHint="False" WindowManagerAddShadowHint="False"
MinWidth="{Binding Bounds.Width, RelativeSource={RelativeSource TemplatedParent}}" MinWidth="{Binding Bounds.Width, RelativeSource={RelativeSource TemplatedParent}}"
IsOpen="{TemplateBinding IsSubMenuOpen, IsOpen="{TemplateBinding IsSubMenuOpen, Mode=TwoWay}"
Mode=TwoWay}"
StaysOpen="True"> StaysOpen="True">
<Border Background="{DynamicResource MenuFlyoutPresenterBackground}" <Border Background="{DynamicResource MenuFlyoutPresenterBackground}"
BorderBrush="{DynamicResource MenuFlyoutPresenterBorderBrush}" BorderBrush="{DynamicResource MenuFlyoutPresenterBorderBrush}"
@ -183,10 +187,15 @@
</Style> </Style>
<Style Selector="MenuItem"> <Style Selector="MenuItem">
<!-- Narrow padding should be used for mouse input, when non-narrow one should be used for touch input in future. --> <!-- Narrow padding should be used for mouse input, when non-narrow one should be used for touch input in future. -->
<Setter Property="Padding" Value="{DynamicResource MenuFlyoutItemThemePaddingNarrow}" /> <Setter Property="Padding" Value="{StaticResource MenuFlyoutItemThemePaddingNarrow}" />
</Style> </Style>
<Style Selector="Menu > MenuItem">
<!-- Custom padding for Menu > MenuItem -->
<Setter Property="Padding" Value="{StaticResource MenuBarItemPadding}" />
</Style>
<Style Selector="MenuItem /template/ ContentPresenter#PART_IconPresenter"> <Style Selector="MenuItem /template/ ContentPresenter#PART_IconPresenter">
<Setter Property="IsVisible" Value="False" /> <Setter Property="IsVisible" Value="False" />
</Style> </Style>
@ -212,14 +221,15 @@
<Setter Property="Fill" Value="{DynamicResource MenuFlyoutSubItemChevronPointerOver}" /> <Setter Property="Fill" Value="{DynamicResource MenuFlyoutSubItemChevronPointerOver}" />
</Style> </Style>
<Style Selector="MenuItem:pressed /template/ Border#PART_LayoutRoot"> <!-- Listen for PART_LayoutRoot:pointerover, so it will not be triggered when subitem is pressed -->
<Style Selector="MenuItem:pressed /template/ Border#PART_LayoutRoot:pointerover">
<Setter Property="Background" Value="{DynamicResource MenuFlyoutItemBackgroundPressed}" /> <Setter Property="Background" Value="{DynamicResource MenuFlyoutItemBackgroundPressed}" />
<Setter Property="BorderBrush" Value="{DynamicResource MenuFlyoutItemBorderBrushPressed}" /> <Setter Property="BorderBrush" Value="{DynamicResource MenuFlyoutItemBorderBrushPressed}" />
</Style> </Style>
<Style Selector="MenuItem:pressed /template/ TextBlock#PART_InputGestureText"> <Style Selector="MenuItem:pressed /template/ Border#PART_LayoutRoot:pointerover TextBlock#PART_InputGestureText">
<Setter Property="Foreground" Value="{DynamicResource MenuFlyoutItemKeyboardAcceleratorTextForegroundPressed}" /> <Setter Property="Foreground" Value="{DynamicResource MenuFlyoutItemKeyboardAcceleratorTextForegroundPressed}" />
</Style> </Style>
<Style Selector="MenuItem:pressed /template/ Path#PART_ChevronPath"> <Style Selector="MenuItem:pressed /template/ Border#PART_LayoutRoot:pointerover Path#PART_ChevronPath">
<Setter Property="Fill" Value="{DynamicResource MenuFlyoutSubItemChevronPressed}" /> <Setter Property="Fill" Value="{DynamicResource MenuFlyoutSubItemChevronPressed}" />
</Style> </Style>

Loading…
Cancel
Save