ContentControl中嵌入的交互触发器

时间:2013-01-09 22:46:07

标签: wpf silverlight 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>

除了显然我不想在我需要的地方粘贴数十次。所以我试着把它们放在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时,交互触发器似乎没有触发。它会显示模板化的项目,但似乎忽略了触发器?

所以问题是,为什么附加到模板化项目的触发器会被忽略,或者,有没有更好的方法来实现我想要的?

1 个答案:

答案 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中