4

因此,为了让问题保持简单,我需要例如数十次使用这样的东西;

    <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,交互触发器似乎不会触发。它会很好地显示模板项目,但似乎忽略了触发器?

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

4

1 回答 1

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我没有使用 using ,而是使用TargetObject并绑定到模板化父级。您不能通过名称定位模板中的元素,它是一个不同的名称范围,据我所知,TargetName 在样式中根本不起作用,仅在 ControlTemplate.Triggers 中

于 2013-01-09T23:05:52.623 回答