在WPF中设置多个菜单的样式

时间:2013-12-11 22:00:20

标签: c# wpf xaml

我是WPF的新手,正在尝试弄清楚如何自定义Windows 7触摸屏应用程序的菜单。我正在使用从StackOverflow上的另一个问题中获取的下面的xaml来设置其中一个菜单。我现在想要设置另一个将以不同方式使用的菜单。我如何设置相同类型的另一个菜单?

如果答案应该很简单/我应该能够找到答案,请发布一个指向我可以阅读的关于如何做这类事情的链接。我一直在审查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>

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我最终在样式style.resources中定义了子对象的样式。

    <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>