2014-05-25 68 views
0

我有一个按钮,这个按钮有一个上下文菜单。当左击按钮时,我使用按钮点击触发器将ContextMenu.IsOpen属性设置为true。 我的问题是如下 - 只要我做的按钮不点击右键,在右键菜单不继承我在窗口的资源定义的样式。 我搜索了它,发现上下文菜单的样式只有在右键单击后才初始化。 即使我不右键单击它,我如何强制样式初始化? (我无法将上下文菜单的样式设置为硬编码,因为我希望在更改主题时自动轻松地更改上下文菜单的样式,而不需要单独维护每个上下文菜单(对于我的代码)。 谢谢!的ContextMenu不继承资源风格

的XAML:

`

<Window.Resources> 
    <Style TargetType="ContextMenu"> 
     <Setter Property="Background" Value="Green"/> 
    </Style> 
</Window.Resources> 

<Grid> 
    <Button Content="Click Me!" Width="80" Height="50"> 
     <Button.Style> 
      <Style TargetType="Button"> 
       <Style.Triggers> 
        <EventTrigger RoutedEvent="Click"> 
         <EventTrigger.Actions> 
          <BeginStoryboard> 
           <Storyboard> 
            <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsOpen"> 
             <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/> 
            </BooleanAnimationUsingKeyFrames> 
           </Storyboard> 
          </BeginStoryboard> 
         </EventTrigger.Actions> 
        </EventTrigger> 
       </Style.Triggers> 
      </Style> 
     </Button.Style> 
     <Button.ContextMenu> 
      <ContextMenu> 
       <MenuItem> 
        <MenuItem.Header> 
         <CheckBox Content="Include First Option"/> 
          </MenuItem.Header> 
       </MenuItem> 
       <MenuItem> 
        <MenuItem.Header> 
         <CheckBox Content="Include Second Option"/> 
        </MenuItem.Header> 
       </MenuItem> 
      </ContextMenu> 
     </Button.ContextMenu> 
    </Button> 
</Grid> 

'

回答

0

创建自己的完整的风格(这这里只是一个简单的示例),并配有专用钥匙使用。

<Style x:Key="CustomContextMenu" 
     TargetType="{x:Type ContextMenu}"> 
    <Setter Property="Background" 
      Value="Green" /> 
    <Setter Property="BorderBrush" 
      Value="#888888" /> 
    <Setter Property="BorderThickness" 
      Value="1" /> 
    <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="{x:Type ContextMenu}"> 
       <Border Name="Border" 
         Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 
        <StackPanel IsItemsHost="True" 
           KeyboardNavigation.DirectionalNavigation="Cycle" /> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="HasDropShadow" 
           Value="true"> 
         <Setter TargetName="Border" 
           Property="Padding" 
           Value="0,3,0,3" /> 
         <Setter TargetName="Border" 
           Property="CornerRadius" 
           Value="4" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

使用

<Button.ContextMenu> 
    <ContextMenu Style="{StaticResource CustomContextMenu}"> 
     <MenuItem> 
      <MenuItem.Header> 
       <CheckBox Content="Include First Option" /> 
      </MenuItem.Header> 
     </MenuItem> 
     <MenuItem> 
      <MenuItem.Header> 
       <CheckBox Content="Include Second Option" /> 
      </MenuItem.Header> 
     </MenuItem> 
    </ContextMenu> 
</Button.ContextMenu> 

希望帮助!

enter image description here

+0

它并没有真正解决我的问题 - 如果我你有什么建议,这意味着每次我更改主题时,我需要改变所有的上下文菜单的风格我手头上有我的代码,这不是很方便维护(我更喜欢使用没有键的样式,所以它只会继承样式,就像任何普通的控件一样)。有什么建议么?不管怎么说,还是要谢谢你 :) – user3673905

1

找到我一直在寻找的答案 - 文本菜单是一个特殊的控制 - 它并不把它定义在窗口的一部分,而是一个分开的窗口。右击它后,它会检查是谁调用它并初始化可继承的属性。但是,以不同的方式打开它 - 它不知道是谁打开它的。 答案 - 为了使上下文菜单的默认样式要覆盖,风格已在App.xaml中被定义没有钥匙。

的App.xaml中的资源应该是这样的:

<Application.Resources> 
     <Style TargetType="ContextMenu"> 
      <Setter Property="Background" Value="Green"/> 
     </Style> 
    </Application.Resources>