WPF菜单 - 如何为顶级项目使用不同的模板

时间:2014-12-15 17:16:54

标签: wpf xaml hierarchicaldatatemplate

我想将不同的模板应用到我的WPF菜单控件中,具体取决于该项目是否为"顶级"项目与否。特别是,我想要一个更大的图标以上顶级项目的文本和一个更小的图标到左侧其他项目的文本。

这是我现在正在使用的(工作)XAML,它正确地格式化顶级项目,但其他项目看起来很傻和太大:

<WrapPanel Height="Auto">
    <Menu ItemsSource="{Binding DataContext.EventMenu.TopLevel, ElementName=UserControl}">
        <Menu.ItemContainerStyle>
            <Style TargetType="{x:Type MenuItem}">
                <Setter Property="IsEnabled" Value="true"/>
                <Setter Property="Command" Value="{Binding Command}" />
                <Setter Property="CommandParameter" Value="{Binding EventType}"/>
            </Style>
        </Menu.ItemContainerStyle>
        <Menu.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>
                    <Image Grid.Row="0" Width="32" Height="32"  Margin="5" VerticalAlignment="Center" Source="{Binding Icon32}"/>
                    <TextBlock Grid.Row="1" Margin="5" Text="{Binding Name}"/>
                </Grid>
            </HierarchicalDataTemplate>
        </Menu.ItemTemplate>
    </Menu>
</WrapPanel>

我希望其他项目有这样的模板:

                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Height="*"/>
                        <ColumnDefinition Height="Auto"/>
                    </Grid.ColumnDefinitions>
                    <Image Grid.Column="0" Width="16" Height="16"  Margin="5" VerticalAlignment="Center" Source="{Binding Icon16}"/>
                    <TextBlock Grid.Column="1" Margin="5" Text="{Binding Name}"/>
                </Grid>

如何通过&#34;顶级&#34;区分两个不同的模板。我宁愿不必添加属性来指示哪个是顶级项目,但如果需要可以这样做。

1 个答案:

答案 0 :(得分:1)

您应该为菜单控件创建两个样式(在单独的资源字典中)。一个是样式键(对于顶级项),另一个是没有键,因此一个将是默认样式。因此,您只需要在顶级项目中明确设置样式。