Chr*_* W. 5 silverlight wpf xaml styles contentcontrol
因此,为了使问题简单,我需要使用类似的东西数十次;
<Rectangle>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown">
<ei:ChangePropertyAction TargetName="AnotherObjectOnTheView"
PropertyName="Visibility"
Value="Visible" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Rectangle>
Run Code Online (Sandbox Code Playgroud)
但显然我不想在我需要的地方粘贴几十次。所以我尝试将它们放入ContentControl类似这样的东西中:
<Style x:Key="MyThingy" TargetType="ContentControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ContentControl">
<Rectangle>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown">
<ei:ChangePropertyAction TargetName="AnotherObjectOnTheView"
PropertyName="Visibility"
Value="Visible" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Rectangle>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
有了这个想法,我可以通过调用模板来替换每个实例的所有内容;
<ContentControl Style="{StaticResource MyThingy}"/>
Run Code Online (Sandbox Code Playgroud)
除了问题是,当嵌入ContentControl,交互触发器似乎不会触发。它会很好地显示模板化项目,但似乎忽略了触发器?
所以问题是,为什么附加到模板化项目的触发器被忽略,或者是否有更好的方法来完成我想要的事情?
并不是说它们Interaction.Triggers没有被调用——它们正在被调用,这是ChangePropertyAction有问题的。
例如,这会很好地工作:
<Style x:Key="MyThingy" TargetType="ContentControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ContentControl">
<Rectangle Fill="Red">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown">
<ei:ChangePropertyAction TargetObject="{Binding RelativeSource={RelativeSource TemplatedParent}}"
PropertyName="Visibility"
Value="Collapsed" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Rectangle>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
请注意,我所做的唯一更改是 1. 将矩形设为红色(以便您可以更好地看到它何时消失)和 2. 单击按钮后立即让触发器隐藏矩形。
那么为什么我的代码可以工作呢?TargetName因为我没有使用,而是使用TargetObject并绑定到模板化父级。您不能通过名称定位模板中的元素,它是一个不同的名称范围,而且据我记得 TargetName 根本不适用于样式,仅适用于 ControlTemplate.Triggers