Trigger
Interactivity 名前空間にある Blend-style と、WPF のTrigger
Styles などを介して利用できるクラシックな s の間には大きな違いがあるように思えますControlTemplate
(これはおそらく SilverLight にも当てはまると思います)。
WPF ではTrigger
、Setter を使用して a を設定すると、2 つの動作が得られます。トリガー条件が満たされた場合、Setter が適用されます。ただし、トリガーが満たされなくなると、以前の値が復元されます。これは、UI をプログラミングするときに非常に役立ちます。
DataTrigger
Blend の方法を使用して同様のコードを作成しようとしました。ChangePropertyAction をコントロールに適用DataTrigger
し、ViewModel へのバインディングを使用して対話性からトリガーします。
<Rectangle x:Name="SecondaryHighlightBackground" Fill="#FF505050">
<i:Interaction.Triggers>
<ei:DataTrigger Binding="{Binding IsHighlighted}" Value="Value">
<ei:ChangePropertyAction PropertyName="Opacity" Value="0.5"/>
</ei:DataTrigger>
</i:Interaction.Triggers>
...
</Rectangle>
したがって、これは期待どおりに機能しました... IsHighlighted 値を false に切り替えたときに、元の 0% の不透明度が復元されないことに驚いたことを除いて (私はそれを低く設定しました)。これを再確認するために、次の例を作成して確認しました。
<Window x:Class="TestWpfApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="Window"
Title="MainWindow"
Width="640"
Height="480">
<Grid x:Name="LayoutRoot">
<Button Name="button1"
Width="173"
Height="57"
Margin="10,10,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top">
<Button.Style>
<Style TargetType="Button">
<Setter Property="Content" Value="foo" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsMouseOver, ElementName=button1}" Value="True">
<Setter Property="Content" Value="bar" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</Grid>
</Window>
期待される動作は、ボタンの上にマウスを置くと、コンテンツが「バー」に変わることです。マウスを離すと、Style で指定されているように、コンテンツが 'Foo' に復元されます。スタイルは、プロパティの優先順位の問題を回避するためにコンテンツを設定します。
私の質問は次のとおりです。Blend 拡張機能に双方向トリガーが本当に欠けているのでしょうか、それともこれを有効にする方法はありますか?
何か不足していますか?双方向の機能を備えているのが、まさにトリガーのポイントだと思いました。便利で直感的な Blend のインタラクティブ アクションを使い続けたいと思っていますが、この種のことから、XAML を手動でコーディングする必要があります。