我有一个派生自滑块的类,它使用自定义控件模板并具有一些添加的依赖项属性。我想根据新属性在模板中触发触发器。
例如,我有一个名为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的设计人员和代码背后出现很多问题。
有没有人知道是否有一种标准方法来解决所有这些问题?作为一种解决方法,我尝试通过代码隐藏添加到模板的触发器,但无法使其工作。
答案 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类的命名空间。