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使用してバインドしているためです。TargetObjectテンプレート内の要素を名前でターゲットにすることはできません。これは別の名前スコープです。また、TargetNameがスタイルではまったく機能せず、ControlTemplate.Triggersでのみ機能することを思い出します。

于 2013-01-09T23:05:52.623 に答える