2013-12-11 87 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

對於不同的ContextMenu你需要2種不同的風格嗎? – terry

+0

是的。上下文菜單根據使用地點不同而不同。 – teynon

回答

3

給你的風格不同的密鑰:

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

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

然後你需要指定哪種風格你想讓你的文本菜單使用

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

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

如果你有這些ContextMenus任何共享的風格,你可以這樣做:

0123然後
<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>