为什么我的菜单项具有时候我已经覆盖了DataTemplate中的图标?(Why does my Me

2019-10-21 13:00发布

我已经成功地实现一个WPF菜单,顶级项目画为大按钮和下级项目被绘制成标准菜单项(见我以前的问题, 在这里和这里 )。

在我这个我下层项目模板(原企图SubItemTemplate在下面的例子中)包含一个图像和文本块。 结果是什么,看起来像一个正常的菜单项具有空图标区,旁边的菜单项的文本部分的文本图像。 我不希望看到的图标区域在视觉显示器,因为我认为整个视觉显示会通过我的模板的内容来确定。 顶级模板( TopLevelItemTemplate )没有任何空白图标区可见。

当我从德较低级别的模板中删除我的形象,并与风格引领者的Icon属性取代了它,我得到了我想要的显示。

我不知道如何和为什么我的下级项的DataTemplate存在图标属性。

这里是我的代码。 该物业HasParent用于区分不属于顶级菜单项(即,绘制与的那些SubItemTemplate )。 我不明白的部分是DataTrigger。

为什么会出现一个图标属性可用的触发器内?

<UserControl.Resources>
    <Image x:Key="MenuIconResource16" Height="16" Width="16" Source="{Binding Icon32}" x:Shared="False" />

    <HierarchicalDataTemplate x:Key="TopLevelItemTemplate" ItemsSource="{Binding Children}">
        <StackPanel VerticalAlignment="Bottom" Orientation="Vertical">
            <Image Width="32" Height="32" VerticalAlignment="Center" Source="{Binding Icon32}" ToolTip="{Binding UserHint}" />
            <TextBlock Text="{Binding Name}"/>
        </StackPanel>
    </HierarchicalDataTemplate>
    <HierarchicalDataTemplate x:Key="SubItemTemplate" ItemsSource="{Binding Children}">
        <TextBlock Text="{Binding Name}"/>
    </HierarchicalDataTemplate>
</UserControl.Resources>

<WrapPanel Height="Auto">
   <Menu ItemsSource="{Binding DataContext.EventMenu.TopLevel, ElementName=UserControl}" ItemTemplateSelector="{StaticResource MenuItemTemplateSelector}">
       <Menu.ItemContainerStyle>
           <Style TargetType="{x:Type MenuItem}">
               <Setter Property="Command" Value="{Binding Command}" />
               <Setter Property="CommandParameter" Value="{Binding EventType}"/>
               <Style.Triggers>
                   <DataTrigger Binding="{Binding HasParent}" Value="true">
                       <Setter Property="Icon" Value="{StaticResource MenuIconResource16}"/>
                   </DataTrigger>
               </Style.Triggers>
           </Style>
       </Menu.ItemContainerStyle>
   </Menu>
</WrapPanel>

Answer 1:

我认为,整个视觉显示会通过我的模板的内容来确定。

@dkozl注意到的区别DataTemplateTemplate -这是很重要的区别。 一种数据模板是所属控制使用作为总体控制,其可以或可以不包括其他的(定制的或硬编码)的视觉元素,和/或其他数据的模板的一部分的XAML片段。 控制模板是控制的这种视觉结构被定义在哪里。 如果设置/重写控件模板,那么你没有看到任何其他视觉内容的预期,将成立。

顶级模板( TopLevelItemTemplate )没有任何空白图标区可见。

其他的事情,这里要注意的是,对默认样式Menu定义了多个控制模板,它MenuItems 。 这些模板取决于角色“TopLevelHeader”应用,“TopLevelItem”,“SubmenuHeader”和“SubmenuItem”。 所以你会看到这些不同的菜单项不同的行为。 看看的默认样式/模板 ,应照明(尽管它们是很复杂)。

为什么会出现一个图标属性可用的触发器内?

样式触发器有修改它被施加到控制的任何依赖项属性的能力。 由于有问题的风格触发被应用到MenuItem控制,它可以修改Icon依赖属性 ,它是由控制拥有。



文章来源: Why does my MenuItem have an Icon when I have overridden the DataTemplate?