一、属性说明
FlowDirection:其子元素的流动方向;
LayoutTransform:在执行布局时应该应用于此元素的图形转换方式。
RenderTransform:元素的呈现位置的转换信息;
RenderTransformOrigin:由RenderTransform声明的任何可能呈现转换的中心点,相对于元素的边界。
HorizontalAlignment/VerticalAlignment:在父元素中组合此元素时所应用的水平对齐特征/垂直对齐特征。
HorizontalContentAlignment/VerticalContentAlignment:控件内容的水平对齐方式/垂直对齐方式。
Items:获取用于生成 ItemsControl 的内容的集合。
ItemTemplate:获取或设置用来显示每个项的 DataTemplate。
ItemsPanel:获取或设置模板,该模板定义对项的布局进行控制的面板。
ItemsSource:获取或设置用于生成 ItemsControl 的内容的集合。
IsMainMenu:获取或设置一个值,该值指示此 Menu 是否接收主菜单激活通知。
SnapsToDevicePixels:获取或设置一个值,该值确定在呈现过程中,此元素的呈现是否应使用特定于设备的像素设置。
ContextMenu:获取或设置通过用户界面请求上下文菜单时应显示的上下文菜单元素, (UI 从此元素中) 。
二、默认
2.1 xaml
<StackPanel Margin="10">
<TextBlock Text="默认"/>
<Menu>
<MenuItem Header="菜单1" FlowDirection="LeftToRight">
<MenuItem.Icon>
<Image Source="../bird1.png"/>
</MenuItem.Icon>
<MenuItem Header="子菜单1">
<MenuItem.Icon>
<Image Source="../bird1.png"/>
</MenuItem.Icon>
<MenuItem Header="子子菜单1">
<MenuItem.Icon>
<Image Source="../bird1.png"/>
</MenuItem.Icon>
</MenuItem>
</MenuItem>
<MenuItem Header="子菜单2"/>
<MenuItem Header="子菜单3"/>
<MenuItem Header="子菜单4"/>
</MenuItem>
<MenuItem Header="菜单2"/>
<MenuItem Header="菜单3"/>
</Menu>
</StackPanel>
2.2 效果
三、修改方向
3.1 xaml 修改一级菜单方向
<StackPanel Margin="10">
<TextBlock Text="修改方向"/>
<Menu>
<Menu.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</Menu.ItemsPanel>
<MenuItem Name="menu1" Header="菜单1" FlowDirection="LeftToRight">
<MenuItem.Icon>
<Image Source="../bird1.png"/>
</MenuItem.Icon>
<MenuItem Header="子菜单1">
<MenuItem.Icon>
<Image Source="../bird1.png"/>
</MenuItem.Icon>
<MenuItem Header="子子菜单1">
<MenuItem.Icon>
<Image Source="../bird1.png"/>
</MenuItem.Icon>
</MenuItem>
</MenuItem>
<MenuItem Header="子菜单2"/>
<MenuItem Header="子菜单3"/>
<MenuItem Header="子菜单4"/>
</MenuItem>
<MenuItem Header="菜单2"/>
<MenuItem Header="菜单3"/>
</Menu>
</StackPanel>
3.2 修改子菜单弹出方向
在loaded中添加以下代码
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
Popup popup = menu1.Template.FindName("PART_Popup", menu1) as Popup;
if (popup != null)
{
popup.Placement = PlacementMode.Right;
}
}
3.3 效果
三、数据绑定
3.1 xaml
<StackPanel Margin="10">
<TextBlock Text="数据绑定"/>
<Menu ItemsSource="{Binding menus}" x:Name="menu3">
<Menu.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</Menu.ItemsPanel>
</Menu>
</StackPanel>
3.2 后台
public List<string> menus { get; set; } = new List<string>();
public MenuUserControl()
{
for (int i = 0; i < 5; i++)
{
menus.Add($"菜单{i + 1}");
}
InitializeComponent();
this.DataContext = this;
}
3.3 效果
四、修改样式
4.1 xaml
<StackPanel Margin="10">
<TextBlock Text="样式修改"/>
<Menu >
<Menu.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</Menu.ItemsPanel>
<MenuItem Header="菜单1" FlowDirection="LeftToRight" Style="{StaticResource MenuItemStyle}">
<MenuItem.Icon>
<Image Source="../bird1.png"/>
</MenuItem.Icon>
<MenuItem Header="子菜单1" Style="{StaticResource MenuItemStyle}">
<MenuItem.Icon>
<Image Source="../bird1.png"/>
</MenuItem.Icon>
<MenuItem Header="子子菜单1" Style="{StaticResource MenuItemStyle}">
<MenuItem.Icon>
<Image Source="../bird1.png"/>
</MenuItem.Icon>
</MenuItem>
</MenuItem>
<MenuItem Header="子菜单2" Style="{StaticResource MenuItemStyle}"/>
<MenuItem Header="子菜单3" Style="{StaticResource MenuItemStyle}"/>
<MenuItem Header="子菜单4" Style="{StaticResource MenuItemStyle}"/>
</MenuItem>
<MenuItem Header="菜单2" Style="{StaticResource MenuItemStyle}"/>
<MenuItem Header="菜单3" Style="{StaticResource MenuItemStyle}"/>
</Menu>
</StackPanel>
4.2 style
<Style x:Key="MenuItemStyle" TargetType="MenuItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="MenuItem">
<Grid ToolTip="{TemplateBinding Header}" Height="40" Background="#FBFBFD" Width="{TemplateBinding Width}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50" />
<ColumnDefinition Width="*" MinWidth="0"/>
</Grid.ColumnDefinitions>
<Border Background="#FFD1E7FF"/>
<Border x:Name="_border" Grid.ColumnSpan="2"/>
<Image x:Name="_imgicon" Width="30" Height="30" Stretch="Fill" Source="/lyrics.ui;component/Basic/Menu/bird1.png" />
<TextBlock Foreground="#2D2D30" Grid.Column="1" Margin="5 0 15 0" VerticalAlignment="Center" x:Name="_txt" Text="{Binding Header,RelativeSource={RelativeSource TemplatedParent}}" />
<Path Visibility="Collapsed" x:Name="_path" Grid.Column="1" HorizontalAlignment="Right" Margin="5 13 5 0" Data="M0,4 4,0 0,-4 z" Fill="#8A92"/>
<Popup Placement="Right" x:Name="SubMenuPopup" AllowsTransparency="True" Focusable="False" IsOpen="{TemplateBinding IsSubmenuOpen}" >
<ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<Border Background="#FFD1E7FF" Name="SubmenuBorder" BorderBrush="LightGray" BorderThickness="1" SnapsToDevicePixels="True" >
<StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle" />
</Border>
</ScrollViewer>
</Popup>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="HasItems" Value="true">
<Setter TargetName="_path" Property="Visibility" Value="Visible"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="_border" Property="Background" Value="#FF84BDE4"/>
<Setter TargetName="_txt" Property="Foreground" Value="White"/>
<Setter TargetName="_path" Property="Fill" Value="White"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter TargetName="_txt" Property="Foreground" Value="Gray"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>