将DependencyProperty作为Style Trigger的Setter无效果问题求助
问题根源
你的ButtonPath控件模板中,Path元素的Fill属性直接绑定了静态资源,而非通过TemplateBinding关联到控件自身的Fill依赖属性。这导致Style的DataTrigger修改控件Fill属性时,模板内的Path完全不受影响——因为它根本没监听这个属性的变化。而Height是控件本身的布局属性,所以Trigger能正常生效。
解决方案
1. 修正控件模板的Fill绑定
把模板里Path的Fill从静态资源改为TemplateBinding Fill,让Path的填充色与控件的Fill属性联动:
<ResourceDictionary... xmlns:customControls="..."> <Style TargetType="{x:Type customControls:ButtonPath}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type customControls:ButtonPath}"> <Border Background="Transparent" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="0"> <Viewbox Width="18" Height="18"> <Path x:Name="icon" Data="{TemplateBinding Path}" <!-- 改为绑定控件自身的Fill属性 --> Fill="{TemplateBinding Fill}" Stretch="Fill" /> </Viewbox> </Border> <ControlTemplate.Triggers> <!--some common triggers--> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> <!-- 可选:设置Fill的默认值,替代原来模板里的静态资源 --> <Setter Property="Fill" Value="{StaticResource Brush.Dark.Foreground01.Static}" /> </Style> </ResourceDictionary>
2. 保留原有Style的Trigger逻辑
你的buttonStyle_Record无需修改,现在控件的Fill属性变化会同步到模板内的Path:
<ResourceDictionary ... xmlns:customControls="..."> <Style x:Key="buttonStyle_Record" BasedOn="{StaticResource {x:Type customControls:ButtonPath}}" TargetType="customControls:ButtonPath"> <Style.Triggers> <DataTrigger Binding="{Binding TimerActive}" Value="true"> <Setter Property="Fill" Value="Red" /> <Setter Property="Height" Value="25" /> </DataTrigger> </Style.Triggers> </Style> </ResourceDictionary>
原理说明
TemplateBinding的作用是将模板内元素的属性与控件自身的属性建立绑定关系,当控件的属性(这里是Fill依赖属性)发生变化时,模板内的元素会自动更新。原来的静态资源是固定值,不会响应控件属性的变化,所以Trigger无法生效。
内容的提问来源于stack exchange,提问作者AAng
相关产品推荐
相关产品推荐

