ContentControl 中嵌入的交互触发器

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

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

Bla*_*hma 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>
Run Code Online (Sandbox Code Playgroud)

请注意,我所做的唯一更改是 1. 将矩形设为红色(以便您可以更好地看到它何时消失)和 2. 单击按钮后立即让触发器隐藏矩形。

那么为什么我的代码可以工作呢?TargetName因为我没有使用,而是使用TargetObject并绑定到模板化父级。您不能通过名称定位模板中的元素,它是一个不同的名称范围,而且据我记得 TargetName 根本不适用于样式,仅适用于 ControlTemplate.Triggers

  • 啊是的,现在我的问题有几种答案。首先,我忘记了“IsHitTestVisible=True”(这也是 Fill 所完成的功能。)以及无法通过更改属性与模板外部的控件进行交互,而无需连接到虚拟机。谢谢布拉什玛!:) (2认同)