【问题标题】:Creating a separator in menuitem WPF xaml在 menuitem WPF xaml 中创建分隔符
【发布时间】:2013-06-10 07:40:35
【问题描述】:

我的 xaml 如下所示。我有一个可观察的菜单集合(称为 Menulist),它又由一组称为 MenuItems 的 MenuItems 组成,我如何在 xaml 中创建分隔符样式

  <Menu Name="menu" DockPanel.Dock="Top" ItemsSource="{Binding MenuList}">
         <Menu.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Path=MenuItems}">
                <HierarchicalDataTemplate.ItemContainerStyle>
                    <Style TargetType="MenuItem">
                        <Setter Property="Command" Value="{Binding MenuClick}" />
                        <Setter Property="IsCheckable" Value="{Binding Checkable}" /> 
                    </Style>
                </HierarchicalDataTemplate.ItemContainerStyle>
                <StackPanel Orientation="Horizontal">
                    <Image Source="{Binding ImageSource}" />
                    <Label Content="{Binding Name}"/>
               </StackPanel>
            </HierarchicalDataTemplate>            
        </Menu.ItemTemplate>
       </Menu>

【问题讨论】:

    标签: .net wpf xaml


    【解决方案1】:

    也许是这种 hack(未测试):

    <Menu Name="menu" DockPanel.Dock="Top" ItemsSource="{Binding MenuList}">
     <Menu.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Path=MenuItems}">
            <HierarchicalDataTemplate.ItemContainerStyle>
                <Style TargetType="MenuItem">
                    <Setter Property="Command" Value="{Binding MenuClick}" />
                    <Setter Property="IsCheckable" Value="{Binding Checkable}" /> 
                </Style>
            </HierarchicalDataTemplate.ItemContainerStyle>
            <StackPanel Orientation="Horizontal" Visibility="{Binding IsSeparator,Converter=hideIfTrue}">
                <Image Source="{Binding ImageSource}" />
                <Label Content="{Binding Name}"/>
           </StackPanel>
           <Separator Visibility="{Binding IsSeparator,Converter=showIfTrue}" />
        </HierarchicalDataTemplate>            
      </Menu.ItemTemplate>
    </Menu>
    

    使用 showIfTruehideIfTrue 一些 converters 接受布尔值并返回 Visibility.Visible Visibility.Collapse 如果布尔值为真。

    【讨论】:

    • 在这种情况下会不会多次设置可视化树?
    • 这就是想法:确实您可能需要将它们包装在 Grid 或另一个 ContentControl 中。
    【解决方案2】:

    您可以创建自定义分隔符样式,如下所示。

     <Style x:Key="MySeparatorStyle" TargetType="{x:Type Separator}">
            <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}"/>
            <Setter Property="Margin" Value="0,2,0,2"/>
            <Setter Property="Focusable" Value="false"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Separator}">
                        <Border 
                            BorderBrush="{TemplateBinding BorderBrush}" 
                            BorderThickness="{TemplateBinding BorderThickness}" 
                            Background="{TemplateBinding Background}" 
                            Height="1" 
                            SnapsToDevicePixels="true"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    

    使用这个。

     <Menu Name="menu" DockPanel.Dock="Top" ItemsSource="{Binding MenuList}">
             <Menu.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Path=MenuItems}">
                   .......
                </HierarchicalDataTemplate>            
                  <Separator Style={StaticResource MySeparatorStyle}" />
            </Menu.ItemTemplate>
           </Menu>
    

    【讨论】:

    • 此密钥将在哪里使用?在 menuitem setter 属性中? menuitem setter 属性没有分隔符
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多