如何在控件模板触发器使用自定义属性

问题描述 投票:7回答:2

我有一个从滑块派生的类,它使用一个自定义的控制模板,并有一些附加依赖属性。我想基于新的属性在模板中触发的触发器。

例如,我有一个名为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的目标类型设置为滑块这是不行的。但是,如果我改变地说:

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

然后,我遇到与模板类型从控制不同的问题。解决这个问题的唯一方法是使用本地创建XAML:myCustomSlider的类型,而不是滑块。但是,这样做会导致大量的与VisualStudio的设计师和代码背后的问题。

有谁知道是否有一个标准的方法来解决这一切?作为一种变通方法我试图通过后台代码添加到模板的触发器,但一直没能得到那个工作。

wpf
2个回答
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}找到自定义属性。之后,它的工作原理完全符合市场预期。


3
投票

它看起来像有解决这个问题的一个更简单的方法。

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

其中地方是CustomSlider类的命名空间。

© www.soinside.com 2019 - 2024. All rights reserved.