【问题标题】:WPF MenuItem MouseOver does not change the background colorWPF MenuItem MouseOver 不会改变背景颜色
【发布时间】:2021-05-31 03:54:43
【问题描述】:

如下图所示,我在后续XAML中使用的style成功地将菜单项的默认背景色和前景色分别更改为蓝色和白色。但是在鼠标悬停时,它不会将MenuItembackground color 更改为浅蓝色(而是保持鼠标悬停的默认颜色)。我可能在这里遗漏了什么,我们该如何解决这个问题?我尝试了thisthis 帖子的解决方案,但仍然没有运气。

菜单快照

<Menu>
    <MenuItem Header="_File" Background="{DynamicResource MahApps.Brushes.Accent}" Width="32" Height="30">
        <MenuItem.Resources>
        <Style BasedOn="{StaticResource MahApps.Styles.MenuItem}" TargetType="MenuItem">
            <Setter Property="Background" Value="{StaticResource MahApps.Brushes.Accent}"/>
            <Setter Property="Foreground" Value="{StaticResource MahApps.Brushes.IdealForeground}"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type MenuItem}">
                        <Grid Background="{TemplateBinding Background}">
                            <MenuItem Header="{TemplateBinding Header}" />
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Background" Value="{StaticResource MahApps.Brushes.Badged.Background}"/>
                            </Trigger>
                            </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
                </Setter>
            </Style>
        </MenuItem.Resources>
        <MenuItem Header="_New" />
        <MenuItem Header="_Open" />
        <MenuItem Header="_Save" />
        <Separator />
        <MenuItem Header="_Exit" />
    </MenuItem>
</Menu>

更新

我已经上传了这个非常基本的 WPF 示例项目here - 以防有人想测试他/她的建议。此文件上传链接将在 30 天后过期。

【问题讨论】:

    标签: wpf menuitem mahapps.metro


    【解决方案1】:

    你有两种方法:

    • 不要在模板中使用&lt;MenuItem Header="{TemplateBinding Header}" /&gt;,而是使用自定义模板。
      如果您像这样更改 ControlTemplate:
    <mah:MetroWindow.Resources>
        <ControlTemplate x:Key="MenuItemTemplate"
                         TargetType="{x:Type MenuItem}">
            <Grid Background="{TemplateBinding Background}">
                <TextBlock Text="{TemplateBinding Header}"/>
            </Grid>
            <ControlTemplate.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="{StaticResource MahApps.Brushes.Badged.Background}"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
        
        <Style BasedOn="{StaticResource MahApps.Styles.MenuItem}" 
               TargetType="MenuItem"
               x:Key="MenuStyle">
            <Setter Property="Background" Value="{StaticResource MahApps.Brushes.Accent}"/>
            <Setter Property="Foreground" Value="{StaticResource MahApps.Brushes.IdealForeground}"/>        
        </Style>    
        
    </mah:MetroWindow.Resources>
    
    <Grid>
        <Menu>
            <MenuItem Header="_File"
                      Background="{DynamicResource MahApps.Brushes.Accent4}"
                      Width="60"
                      Height="30">
                <MenuItem.Resources>
                    <Style TargetType="{x:Type MenuItem}" BasedOn="{StaticResource MenuStyle}"/>
                </MenuItem.Resources>
                <MenuItem Header="_New" Template="{StaticResource MenuItemTemplate}"/>
                <MenuItem Header="_Open" Template="{StaticResource MenuItemTemplate}"/>
                <MenuItem Header="_Save" Template="{StaticResource MenuItemTemplate}"/>
                <Separator />
                <MenuItem Header="_Exit" Template="{StaticResource MenuItemTemplate}" />
            </MenuItem>
        </Menu>
    </Grid>
    

    你会看到鼠标悬停的背景变化

    • 使用默认模板,但自定义鼠标悬停颜色。在资源中定义SelectionFill刷。如果您需要为应用程序使用设置颜色Application ResourceDictionary
      MenuStyle 应用于子项_File
    <mah:MetroWindow.Resources>
        <SolidColorBrush x:Key="MahApps.Brushes.MenuItem.SelectionFill" Color="White" />
        
        <Style BasedOn="{StaticResource MahApps.Styles.MenuItem}" 
               TargetType="MenuItem"
               x:Key="MenuStyle">
            <Setter Property="Background" Value="{StaticResource MahApps.Brushes.Accent}"/>
            <Setter Property="Foreground" Value="{StaticResource MahApps.Brushes.IdealForeground}"/>        
        </Style>
    </mah:MetroWindow.Resources>
    
    <Grid>
        <Menu>
            <MenuItem Header="_File"
                      Background="{DynamicResource MahApps.Brushes.Accent2}"
                      Width="60"
                      Height="30">
                <MenuItem.Resources>
                    <Style TargetType="{x:Type MenuItem}" BasedOn="{StaticResource MenuStyle}" />
                </MenuItem.Resources>
                <MenuItem Header="_New" />
                <MenuItem Header="_Open"/>
                <MenuItem Header="_Save" />
                <Separator />
                <MenuItem Header="_Exit" />
            </MenuItem>
        </Menu>
    </Grid>
    

    您可以查看MenuItem样式here
    触发IsHighlighted改变选择样式。

    <Trigger Property="IsHighlighted" Value="True">
       <Setter TargetName="Bg" Property="Fill" Value="{DynamicResource MahApps.Brushes.MenuItem.SelectionFill}" />
       <Setter TargetName="Bg" Property="Stroke" Value="{DynamicResource MahApps.Brushes.MenuItem.SelectionStroke}" />
    </Trigger>
    

    【讨论】:

    • 您的第一个建议无效。为了确保我做对了:在我的 xaml(如我上面的帖子中所示)中,我将 &lt;MenuItem Header="{TemplateBinding Header}" /&gt; 替换为 &lt;TextBlock Text="{TemplateBinding Header}" /&gt;。在您的第二个建议中,我不确定我将在哪里使用默认模板,以及我在哪里进行更改。
    • 我在上面我的帖子的 UPDATE 部分中包含了这个非常基本的示例项目的链接 - 以防您或其他人想自己测试它。
    • 您更新的建议有效(谢谢)。一个小错字:我确定您打算关闭此标签:&lt;TextBlock Text="{TemplateBinding Header}"&gt;.
    猜你喜欢
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2014-04-21
    • 2021-01-23
    • 2011-06-15
    • 2018-09-23
    相关资源
    最近更新 更多