2

我正在ExpressionDark为我的 WPF 应用程序使用主题,它有一个自定义样式用于MenuItems. 当 aMenuItem被禁用时,它应该使用灰色样式来反映这一点,并且它适用于控件MenuItems内部Menu

工作菜单状态

但是,它不适用于MenuItemsContextMenu禁用复制)

复制应该看起来像禁用

我已将问题追查到 TextBlock 样式,如果我删除此样式,它适用于 ContextMenu,但其他样式会随着它的删除而中断

<Style TargetType="{x:Type TextBlock}">
    <Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
</Style>

编辑:无论我使用 aMenuItem还是我的 custom都没有关系GestureMenuItem,但重要的是我是否使用 _ char(对于快捷键)如果我删除 _ 那么该样式也不会起作用MainMenu

的相关样式MenuItem

<Trigger Property="IsEnabled" Value="false">
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
</Trigger>

源代码在这里找到。相关的ContextMenuXAML:

<TextBox x:Name="Text"
    Height="Auto"
    TextWrapping="Wrap"
    VerticalScrollBarVisibility="Visible"
    AcceptsReturn="True"
    IsReadOnly="true">
    <TextBox.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Copy" Command="Copy">
                <MenuItem.Icon>
                    <Image Source="{StaticResource IconCopy}"/>
                </MenuItem.Icon>
            </MenuItem>
            <Separator></Separator>
            <MenuItem cal:Message.Attach="Clear()" Header="Clear All">
                <MenuItem.Icon>
                    <Image Source="{StaticResource IconDelete}"/>
                </MenuItem.Icon>
            </MenuItem>
        </ContextMenu>
    </TextBox.ContextMenu>
</TextBox>

MenuItems在工作主菜单中(GestureMenuItem继承MenuItem并使用相同的样式):

<Menu IsMainMenu="True">
    <Menu.Resources>
        <Image x:Key="ViewIcon" x:Shared="false"
            Source="{Binding Path=Icon}" />
    </Menu.Resources>
    <!-- Items here removed to shorten XAML -->
    <MenuItem Header="_Script">
        <common:GestureMenuItem x:Name="RunScript" Header="_Run script" Key="F5">
            <MenuItem.Icon>
                <Image Source="{StaticResource IconPlay}"/>
            </MenuItem.Icon>
        </common:GestureMenuItem>
      <common:GestureMenuItem x:Name="StopScript" Header="_Stop script" Key="F5" Modifiers="Shift">
            <MenuItem.Icon>
                <Image Source="{StaticResource IconStop}"/>
            </MenuItem.Icon>
        </common:GestureMenuItem>
    </MenuItem>
    <!-- Items here removed to shorten XAML -->
</Menu>

手势项目样式:

<Style TargetType="{x:Type Caliburn:GestureMenuItem}" BasedOn="{StaticResource {x:Type MenuItem}}">
</Style>

我想出了一个解决方法,它不会给出完全相同的风格,但它有效,我应该去吗?

<Trigger Property="IsEnabled" Value="False">
    <Setter Property="Opacity" Value="0.5"/>
</Trigger>

使用此解决方案,手势文本和图标都是灰色的,因此它实际上可能是比仅将 Forecolor 设置为灰色更好的解决方案:

不透明解决方案

4

2 回答 2

4

我通过用 Opacity 属性设置器替换 Forecolor 属性设置器来解决它,这也会影响手势文本和图标,这也是默认样式的执行方式

不透明解决方案

<Trigger Property="IsEnabled" Value="False">
    <Setter Property="Opacity" Value="0.3"/>
</Trigger>
于 2013-02-02T17:44:18.617 回答
0

我发现分别针对 InputGestureText 和 Header 的 ContentPresenters 更有效。在我的案例中,针对整个 MenuItem 导致了透明的 MenuItem。我已经展示了如何解决以下问题:

<Trigger Property="IsEnabled" Value="False">
    <Setter TargetName="HeaderHost" Property="Opacity" Value="0.3"/>
    <Setter TargetName="IGTHost" Property="Opacity" Value="0.3"/>
</Trigger>
于 2016-03-08T20:14:24.467 回答