如何在XAML及Material Design Xaml Toolkit中修改按钮悬停颜色?
解决Material Design XAML按钮悬停颜色不生效的问题
你的代码之所以没生效,核心原因有两个:
- 直接在
<Button>标签上设置的Background="Transparent"是本地属性值,优先级高于Style中的Trigger设置,会覆盖悬停时的背景修改。 MaterialDesignFlatButton的默认模板使用VisualStateManager管理状态(如鼠标悬停),自定义的Style Trigger会被模板内的状态逻辑覆盖。
下面提供两种可行的解决方案:
方案1:移除本地属性,重写模板状态
先移除Button标签上的Background="Transparent",转而在Style中设置初始背景,并通过重写ControlTemplate修改悬停状态:
<Button Width="45" Margin="0" Height="40" BorderThickness="0" Click="MinimizeButton_Click"> <Button.Style> <Style TargetType="Button" BasedOn="{StaticResource MaterialDesignFlatButton}"> <!-- 在Style中设置初始背景,替代本地属性 --> <Setter Property="Background" Value="Transparent"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True"> <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> </Border> <ControlTemplate.Triggers> <!-- 修改鼠标悬停时的背景 --> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="border" Property="Background" Value="DarkRed"/> </Trigger> <!-- 保留其他必要状态逻辑 --> <Trigger Property="IsPressed" Value="True"> <Setter TargetName="border" Property="Background" Value="DarkRed"/> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter TargetName="border" Property="Opacity" Value="0.5"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </Button.Style> <Image Source="Images/minimize.png" Height="15" Width="15" /> </Button>
方案2:使用Material Design附加属性(更简洁)
Material Design XAML库提供了专门的附加属性,无需重写模板即可修改悬停背景,前提是项目已引用MaterialDesignThemes库,并在XAML中声明命名空间:
<!-- 先在根元素声明命名空间:xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" --> <Button Width="45" Margin="0" Height="40" BorderThickness="0" Click="MinimizeButton_Click" Background="Transparent" <!-- 直接设置悬停背景 --> materialDesign:ButtonAssist.HoverBackground="DarkRed"> <Button.Style> <Style TargetType="Button" BasedOn="{StaticResource MaterialDesignFlatButton}"/> </Button.Style> <Image Source="Images/minimize.png" Height="15" Width="15" /> </Button>
内容的提问来源于stack exchange,提问作者jasonzs
相关产品推荐
相关产品推荐

