如何在ControlTemplate触发器中使用自定义属性

时间:2012-02-28 16:57:39

标签: wpf

我有一个派生自滑块的类,它使用自定义控件模板并具有一些添加的依赖项属性。我想根据新属性在模板中触发触发器。

例如,我有一个名为ThumbIsVisible的新依赖项属性,当设置为false时,我只需要滑块的拇指部分为hiddin。我的控件模板如下所示:

<Slider.Template>
<ControlTemplate TargetType="{x:Type Slider}">
...
<Track.Thumb>
<Thumb x:Name="m_Thumb" Style="{StaticResource SliderThumbStyle}" />
...

我想添加一个看起来像的触发器:

<ControlTempate.Trigger>
<Trigger Property="ThumbIsVisible" Value="False">
<Setter TargetName="m_Thumb" Property="Visibility" Value="Collapsed" />

马上我可以看到这不起作用,因为我将控件tempate的目标类型设置为Slider。但是,如果我改变它说:

<ControlTemplate TargetType="{x:Type local:myCustomSlider}">

然后我遇到了与控件不同的模板类型的问题。解决这个问题的唯一方法是使用local:myCustomSlider作为类型而不是Slider来创建xaml。但是,这样做会导致VisualStudio的设计人员和代码背后出现很多问题。

有没有人知道是否有一种标准方法来解决所有这些问题?作为一种解决方法,我尝试通过代码隐藏添加到模板的触发器,但无法使其工作。

2 个答案:

答案 0 :(得分:3)

当我花了两天的时间来寻找答案时,我发布问题后只需要30分钟就可以找到答案。哦,解决方案是使用DataTriggers。

<ControlTemplate.Triggers>
  <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=ThumbIsVisible}" Value="False">
    <Setter TargetName="m_Thumb" Property="Visibility" Value="Hidden" />
  </DataTrigger>
</ControlTemplate.Triggers>

关键是使用RelativeSource = {RelativeSource Self}来查找自定义属性。之后,它完全符合预期。

答案 1 :(得分:3)

看起来有一种更简单的方法可以解决这个问题。

<ControlTemplate.Triggers>   
  <Trigger Property=local:CustomSlider.ThumbIsVisible" Value="False">     
    <Setter TargetName="m_Thumb" Property="Visibility" Value="Hidden" />
  </Trigger> 
</ControlTemplate.Triggers> 

其中local是CustomSlider类的命名空间。