WPF 控件 (十六、Menu)

文章详细介绍了WPF中的一些关键UI元素属性,如FlowDirection、LayoutTransform和RenderTransform等,以及如何通过XAML修改元素布局和方向。此外,还展示了如何实现数据绑定以动态生成菜单,并提供了修改菜单样式的示例代码。
摘要由CSDN通过智能技术生成

一、属性说明

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>

4.3 效果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值