【问题标题】:ContextMenu doesn't inherits resource styleContextMenu 不继承资源样式
【发布时间】:2014-07-14 10:37:41
【问题描述】:

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

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>

'

【问题讨论】:

    标签: wpf styles contextmenu


    【解决方案1】:

    找到了我一直在寻找的答案 - ContextMenu 是一个特殊的控件——它不是定义它的窗口的一部分,而是一个单独的窗口。右键单击它后,它会检查谁调用了它并初始化可继承的属性。但是当以不同的方式打开它时——它不知道是谁打开了它。 答案 - 为了覆盖上下文菜单的默认样式,该样式必须在 App.xaml 中定义,并且没有键。

    App.xaml 资源应如下所示:

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

    【讨论】:

      【解决方案2】:

      创建您自己的完整样式(这里只是一个简单的示例)并将其与特殊键一起使用。

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

      希望有帮助!

      【讨论】:

      • 它并没有真正解决我的问题——如果我按照你的建议去做,这意味着每次我更改主题时,我都需要手动更改我在代码中拥有的所有上下文菜单的样式,并且不是那么易于维护(我更喜欢使用没有键的样式,因此它只会继承样式,就像任何普通控件一样)。有什么建议?无论如何谢谢:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多