2014-12-15 2 views
1

Я хотел бы применить различные шаблоны к моему элементу управления WPF в зависимости от того, является ли элемент элементом «верхнего уровня» или нет. В частности, я хочу увеличить значок выше текст для элементов верхнего уровня и меньший значок влево текста для других элементов.Меню 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> 

Как я могу иметь два разных шаблона, отличающихся «высшей степенью». Я бы предпочел не добавлять свойство, чтобы указать, что является элементом верхнего уровня, но при необходимости может сделать это.

ответ

1

Вы должны создать два стиля для управления меню (в отдельном словаре ресурсов). Один из них имеет ключ стиля (для элементов верхнего уровня), а другой - без ключа, так что он будет по умолчанию. Поэтому вам нужно явно установить стиль только в элементах верхнего уровня.

+0

Мои предметы взяты из привязки модели. Как я могу позволить WPF узнать, какие из них получают явный стиль? –

+0

Если вы уже знаете тип, вы можете использовать DataType DataTemplate. – WPFUser

+1

Все объекты в дереве меню одного типа. –