XAML中鼠标悬停时将Button的Background设为BorderBrush值的问题
你的问题出在Style Trigger里的绑定方式不对,另外也可以换一种更直接的实现方式,下面给你两种可行的方案:
方案一:修正Style Trigger的绑定
你原来用AncestorType来绑定Button的BorderBrush,其实完全没必要,直接绑定当前Button自身的属性就行,把Trigger里的Background Setter改成下面这样:
<Style TargetType="Button"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="15"> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> </Border> </ControlTemplate> </Setter.Value> </Setter> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <!-- 用RelativeSource Self绑定当前Button的BorderBrush --> <Setter Property="Background" Value="{Binding BorderBrush, RelativeSource={RelativeSource Self}}"/> <Setter Property="Cursor" Value="Hand"/> </Trigger> </Style.Triggers> </Style>
方案二:在ControlTemplate内部添加Trigger(更推荐)
既然你已经重写了Button的ControlTemplate,直接在模板里的Border上添加Trigger,直接修改它的Background,这样逻辑更内聚,也避免Style和Template之间的绑定冲突:
<Style TargetType="Button"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Border x:Name="ButtonBorder" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="15"> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <!-- 直接修改模板内Border的Background为自身的BorderBrush --> <Setter TargetName="ButtonBorder" Property="Background" Value="{Binding BorderBrush, ElementName=ButtonBorder}"/> <Setter Property="Cursor" Value="Hand"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
两种方案都能解决你的问题,方案二更推荐,因为控件的视觉状态逻辑放在ControlTemplate里更符合WPF的设计思路,也更容易维护。
内容的提问来源于stack exchange,提问作者Cover Basha
相关产品推荐
相关产品推荐

