WPF ControlTemplate实现鼠标悬停时按钮背景取BorderBrush颜色
我来帮你搞定这个需求!你尝试的Value="Border.BorderBrush"写法之所以不行,是因为WPF的Setter不能直接通过这种字符串格式来引用元素的属性值,得用数据绑定的方式来实现这个效果。
下面给你两种可行的解决方案:
方案一:直接绑定到Border元素的BorderBrush
我们可以通过ElementName绑定到模板里的Border控件,直接获取它的BorderBrush值来设置Background:
<Trigger Property="IsMouseOver" Value="true"> <Setter TargetName="Border" Property="Background" Value="{Binding ElementName=Border, Path=BorderBrush}"/> </Trigger>
方案二:绑定到Button自身的BorderBrush属性
因为模板里的Border已经用{TemplateBinding BorderBrush}绑定了Button的BorderBrush属性,所以我们也可以直接绑定到Button(模板父元素)的BorderBrush:
<Trigger Property="IsMouseOver" Value="true"> <Setter TargetName="Border" Property="Background" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BorderBrush}"/> </Trigger>
两种方案效果完全一致,你可以根据自己的习惯选择。
修改后的完整Style代码
<Style TargetType="Button"> <Setter Property="Cursor" Value="Hand"/> <Setter Property="Background" Value="White"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Grid> <Border x:Name="Border" CornerRadius="6" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}"> <TextBlock x:Name="ContentBlock" Foreground="{TemplateBinding Foreground}" Text="{TemplateBinding Content}" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock> </Border> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsEnabled" Value="false"> <Setter TargetName="Border" Property="BorderBrush" Value="Gray"></Setter> <Setter TargetName="ContentBlock" Property="Foreground" Value="Gray"></Setter> </Trigger> <Trigger Property="IsMouseOver" Value="true"> <!-- 这里替换成上面两种方案的任意一种即可 --> <Setter TargetName="Border" Property="Background" Value="{Binding ElementName=Border, Path=BorderBrush}"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
内容的提问来源于stack exchange,提问作者RezaNoei
相关产品推荐
相关产品推荐

