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

7

我有一个从滑块类继承的类,使用自定义控件模板,并添加了一些依赖属性。 我想根据新属性在模板内触发触发器。

例如,我有一个名为ThumbIsVisible的新依赖属性,当其设置为false时,我只想隐藏滑块的拇指部分。 我的控件模板如下:

<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" />

一开始我就能看出来这样行不通,因为控件模板的目标类型设置为Slider。但是,如果我将其更改为:

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

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

有没有人知道是否有标准方法可以解决所有这些问题?作为解决方法,我尝试通过代码向模板添加触发器,但是无法使其正常工作。


2
将解决方案添加为答案并接受它,以便它不会作为未回答的问题而存在。 - kevev22
我会在我达到100声望或者8小时新手自问自答限制结束后尽快回复。 - BruceLH
2个回答

4

当然,我在发布问题后仅用了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}来查找自定义属性。之后它会按照预期的方式正常工作。

3
看起来解决这个问题的方法更加简单。
<ControlTemplate.Triggers>   
  <Trigger Property=local:CustomSlider.ThumbIsVisible" Value="False">     
    <Setter TargetName="m_Thumb" Property="Visibility" Value="Hidden" />
  </Trigger> 
</ControlTemplate.Triggers> 

这里的local是CustomSlider类的命名空间。


DataTrigger在.NET 4中不包含Property属性。它对你有什么作用吗? - Nayan
@Nayan:有点晚了,但我想这应该是“触发器”而不是“数据触发器”。 - dotNET

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接