因此,为了使问题简单,我需要的是例如使用这样的东西几十次;
<Rectangle>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown">
<ei:ChangePropertyAction TargetName="AnotherObjectOnTheView"
PropertyName="Visibility"
Value="Visible" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Rectangle>
除了显然我不想在我需要的地方粘贴数十次。所以我试着把它们放在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>
有了这个想法,我可以通过调用模板来替换每个实例的所有内容;
<ContentControl Style="{StaticResource MyThingy}"/>
除了问题是,当嵌入ContentControl
时,交互触发器似乎没有触发。它会显示模板化的项目,但似乎忽略了触发器?
所以问题是,为什么附加到模板化项目的触发器会被忽略,或者,有没有更好的方法来实现我想要的?
答案 0 :(得分:4)
并不是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>
请注意,我所做的唯一更改是1.将矩形设为红色(这样可以更好地查看它何时消失)和2.单击按钮后,触发器会隐藏矩形。
那为什么我的代码有效?因为我没有使用TargetName
,而是使用TargetObject
并绑定到模板化父级。你不能通过名称来定位模板中的元素,它是一个不同的名称范围,据我所知,TargetName在Styles中根本不起作用,仅在ControlTemplate.Triggers中