2013-12-11 2 views
0

Я новичок в WPF и пытаюсь понять, как настроить меню для приложения с сенсорным экраном Windows 7. Я использую xaml ниже, который был взят из другого вопроса в StackOverflow, чтобы создать одно из меню. Теперь я хочу создать другое меню, которое будет использоваться по-другому. Как бы я создал другое меню того же типа?Стилирование нескольких меню в WPF

Если ответ должен быть простым/что-то, что я должен выяснить, отправьте ссылку, где я могу прочитать, как это сделать. Я просматривал MSDN какое-то время, и пока я читаю все, что я уже знаю, я не вижу ничего полезного для меня здесь. (К сожалению, просто обескураживает постоянную борьбу, чтобы найти основную информацию мне нужно выполнить простое задание.)

<Window.Resources> 

     <Style TargetType="ContextMenu"> 
      <Setter Property="SnapsToDevicePixels" Value="True"/> 
      <Setter Property="OverridesDefaultStyle" Value="True"/> 
      <Setter Property="Grid.IsSharedSizeScope" Value="true"/> 
      <Setter Property="HasDropShadow" Value="True"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ContextMenu"> 
         <Border 
          Name="Border" 
          BorderThickness="1" 
          BorderBrush="{DynamicResource userContextMenuBorder}" 
          Background="{DynamicResource userContextMenuBackground}" 
          MinWidth="182" 
          MinHeight="60" 
          > 

          <StackPanel IsItemsHost="True" 
           KeyboardNavigation.DirectionalNavigation="Cycle" 
           > 
          </StackPanel> 
         </Border> 
         <ControlTemplate.Triggers> 
          <Trigger Property="HasDropShadow" Value="true"> 
           <Setter TargetName="Border" Property="Padding" Value="0,3,0,3"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

     <!-- SimpleStyles: MenuItem --> 

     <Style x:Key="{x:Static MenuItem.SeparatorStyleKey}" TargetType="{x:Type Separator}"> 
      <Setter Property="Height" Value="1"/> 
      <Setter Property="Margin" Value="0,4,0,4"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type Separator}"> 
         <Border BorderBrush="{DynamicResource userContextMenuSeparatorBorder}" BorderThickness="1"/> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

     <!-- TopLevelHeader --> 

     <ControlTemplate x:Key="{x:Static MenuItem.TopLevelHeaderTemplateKey}" TargetType="{x:Type MenuItem}"> 
      <Border Name="Border" > 
       <Grid> 
        <ContentPresenter 
          Margin="6,3,6,3" 
          ContentSource="Header" 
          RecognizesAccessKey="True" /> 
             <Popup 
          Name="Popup" 
          Placement="Bottom" 
          IsOpen="{TemplateBinding IsSubmenuOpen}" 
          AllowsTransparency="True" 
          Focusable="False" 
          PopupAnimation="Fade"> 
         <Border 
          Name="SubmenuBorder" 
          SnapsToDevicePixels="True" 
          Background="{DynamicResource userCMSubmenuBackground}" 
          BorderBrush="{DynamicResource userCMSubmenuBorder}" 
          BorderThickness="1" > 
          <StackPanel 
           IsItemsHost="True" 
           KeyboardNavigation.DirectionalNavigation="Cycle" /> 
         </Border> 
        </Popup> 
       </Grid> 
      </Border> 
      <ControlTemplate.Triggers> 
       <Trigger Property="IsSuspendingPopupAnimation" Value="true"> 
        <Setter TargetName="Popup" Property="PopupAnimation" Value="None"/> 
       </Trigger> 
       <Trigger Property="IsHighlighted" Value="true"> 
        <Setter TargetName="Border" Property="Background" Value="{DynamicResource userContextMenuHighlightedBackground}"/> 
        <Setter TargetName="Border" Property="BorderBrush" Value="{DynamicResource userContextMenuHighlightedBorder}"/> 
       </Trigger> 
       <Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="True"> 
        <Setter TargetName="SubmenuBorder" Property="CornerRadius" Value="0,0,4,4"/> 
        <Setter TargetName="SubmenuBorder" Property="Padding" Value="0,0,0,3"/> 
       </Trigger> 
       <Trigger Property="IsEnabled" Value="False"> 
        <Setter Property="Foreground" Value="{DynamicResource userContextMenuForeground}"/> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 

     <!-- SubmenuHeader --> 

     <ControlTemplate 
    x:Key="{x:Static MenuItem.SubmenuHeaderTemplateKey}" 
    TargetType="{x:Type MenuItem}"> 
      <Border Name="Border" Background="{DynamicResource userCMSubmenuHeaderBackground}"> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto" SharedSizeGroup="Icon"/> 
         <ColumnDefinition Width="*" /> 
         <ColumnDefinition Width="Auto" SharedSizeGroup="Shortcut"/> 
         <ColumnDefinition Width="13"/> 
        </Grid.ColumnDefinitions> 
        <ContentPresenter 
     Name="Icon" 
     Margin="6,0,6,0" 
     VerticalAlignment="Center" 
     ContentSource="Icon"/> 
        <ContentPresenter 
     Name="HeaderHost" 
     Grid.Column="1" 
     ContentSource="Header" 
     RecognizesAccessKey="True"/> 
        <TextBlock x:Name="InputGestureText" 
     Grid.Column="2" 
     Text="{TemplateBinding InputGestureText}" 
     Margin="5,2,2,2" 
     DockPanel.Dock="Right"/> 
        <Path 
     Grid.Column="3" 
     HorizontalAlignment="Center" 
     VerticalAlignment="Center" 
     Data="M 0 0 L 0 7 L 4 3.5 Z" 
     Fill="#404040" /> 
        <Popup 
     Name="Popup" 
     Placement="Right" 
     HorizontalOffset="-4" 
     IsOpen="{TemplateBinding IsSubmenuOpen}" 
     AllowsTransparency="True" 
     Focusable="False" 
     PopupAnimation="Fade"> 
         <Border 
      Name="SubmenuBorder" 
      SnapsToDevicePixels="True" 
      Background="#FFFFFF" 
      BorderBrush="#888888" 
      BorderThickness="1" > 
          <StackPanel 
      IsItemsHost="True" 
      KeyboardNavigation.DirectionalNavigation="Cycle" /> 
         </Border> 
        </Popup> 
       </Grid> 
      </Border> 
      <ControlTemplate.Triggers> 
       <Trigger Property="Icon" Value="{x:Null}"> 
        <Setter TargetName="Icon" Property="Visibility" Value="Collapsed"/> 
       </Trigger> 
       <Trigger Property="IsHighlighted" Value="true"> 
        <Setter TargetName="Border" Property="Background"> 
         <Setter.Value> 
          <LinearGradientBrush> 
           <GradientStop Color="#EEEEEE" Offset="0"/> 
           <GradientStop Color="#FFFFFF" Offset="1"/> 
          </LinearGradientBrush> 
         </Setter.Value> 
        </Setter> 
       </Trigger> 
       <Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="True"> 
        <Setter TargetName="SubmenuBorder" Property="CornerRadius" Value="4"/> 
        <Setter TargetName="SubmenuBorder" Property="Padding" Value="0,3,0,3"/> 
       </Trigger> 
       <Trigger Property="IsEnabled" Value="false"> 
        <Setter Property="Foreground" Value="#888888"/> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 

     <!-- MenuItem Style --> 

     <Style x:Key="{x:Type MenuItem}" TargetType="{x:Type MenuItem}"> 
      <Setter Property="OverridesDefaultStyle" Value="True"/> 
      <Style.Triggers> 
       <Trigger Property="Role" Value="TopLevelHeader"> 
        <Setter Property="Template" Value="{StaticResource {x:Static MenuItem.TopLevelHeaderTemplateKey}}"/> 
        <Setter Property="Grid.IsSharedSizeScope" Value="true"/> 
       </Trigger> 
       <Trigger Property="Role" Value="TopLevelItem"> 
        <Setter Property="Template" Value="{StaticResource {x:Static MenuItem.TopLevelItemTemplateKey}}"/> 
       </Trigger> 
       <Trigger Property="Role" Value="SubmenuHeader"> 
        <Setter Property="Template" Value="{StaticResource {x:Static MenuItem.SubmenuHeaderTemplateKey}}"/> 
       </Trigger> 
       <Trigger Property="Role" Value="SubmenuItem"> 
        <Setter Property="Template" Value="{StaticResource {x:Static MenuItem.SubmenuItemTemplateKey}}"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Window.Resources> 
+0

Вам нужны 2 разных стиля для разных ContextMenu? – terry

+0

Да. Контекстное меню будет отличаться в зависимости от того, где оно используется. – teynon

ответ

3

Дайте ваши стили разные ключи:

<Style TargetType="ContextMenu" x:Key="MyStyle1"> 
</Style> 

<Style TargetType="ContextMenu" x:Key="MyStyle2"> 
</Style> 

Затем нужно указать, какой стиль вам хотите, чтобы ваш ContextMenu использовать

<ContextMenu Style="{StaticResource MyStyle1}"></ContextMenu> 

<ContextMenu Style="{StaticResource MyStyle2}"></ContextMenu> 

Если вы имели какой-либо общий стиль для этих ContextMenus, вы можете сделать это:

<Style TargetType="ContextMenu" x:Key="BaseStyle"></Style 

<Style TargetType="ContextMenu" x:Key="MyStyle1" BasedOn="{StaticResource BaseStyle}"> 
</Style> 

<Style TargetType="ContextMenu" x:Key="MyStyle2" BasedOn="{StaticResource BaseStyle}"> 
</Style> 

MyStyle1 и MyStyle2 затем наследовать любые стили от BaseStyle

Все, что эта информация может быть найдена здесь: http://msdn.microsoft.com/en-us/library/ms745683(v=vs.110).aspx

+0

Итак, как бы реализовать это с текущими стилями, которые уже используют ключи: IE '{x: Static MenuItem.SeparatorStyleKey}' – teynon

+0

Чтобы иметь несколько стилей, вам нужно иметь несколько ключей. Таким образом, вы все равно можете использовать статический ключ для одного из ваших стилей, но чтобы иметь альтернативный стиль, вам нужно будет определить новый ключ, например, примеры в ответе. Однако для этих альтернативных стилей вам нужно вручную назначить стиль для каждого из элементов, которые вы хотите по-разному ... –

+0

Я не могу вручную назначать эти стили, так как элементы меню создаются динамически. – teynon

0

Я в конечном итоге определение стилей для дочерних объектов в стиле стилей. Ресурсы.

<Style TargetType="ContextMenu" x:Key="UserMenu"> 
     <Setter Property="SnapsToDevicePixels" Value="True"/> 
     <Setter Property="OverridesDefaultStyle" Value="True"/> 
     <Setter Property="Grid.IsSharedSizeScope" Value="true"/> 
     <Setter Property="HasDropShadow" Value="True"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ContextMenu"> 
        <Border 
          Name="Border" 
          BorderThickness="1" 
          BorderBrush="{DynamicResource userContextMenuBorder}" 
          Background="{DynamicResource userContextMenuBackground}" 
          MinWidth="182" 
          MinHeight="60" 
          > 

         <StackPanel IsItemsHost="True" 
           KeyboardNavigation.DirectionalNavigation="Cycle" 
           > 
         </StackPanel> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="HasDropShadow" Value="true"> 
          <Setter TargetName="Border" Property="Padding" Value="0,3,0,3"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Resources> 
      <!-- SimpleStyles: MenuItem --> 

      <Style TargetType="{x:Type Separator}"> 
       <Setter Property="Height" Value="1"/> 
       <Setter Property="Margin" Value="0,4,0,4"/> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="{x:Type Separator}"> 
          <Border BorderBrush="{DynamicResource userContextMenuSeparatorBorder}" BorderThickness="1"/> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </Style> 
Смежные вопросы