好的,这是我经过一些实验后得出的结论。
我创建了一个带有依赖属性的 Expression Blend 3 触发器(我将其命名为 Subscription)。我将 Subscription 绑定到与 TextBlock 绑定的相同值,并且此触发器附加到 Expression Blend 3 中的 ControlStoryboardAction。
这是触发器:
public class DataTriggerPlus : TriggerBase<DependencyObject>
{
public static readonly DependencyProperty SubscriptionProperty =
DependencyProperty.Register("Subscription",
typeof(string),
typeof(DataTriggerPlus),
new FrameworkPropertyMetadata("",
new PropertyChangedCallback(OnSubscriptionChanged)));
public string Subscription
{
get { return (string)GetValue(SubscriptionProperty); }
set { SetValue(SubscriptionProperty, value); }
}
private static void OnSubscriptionChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
((DataTriggerPlus)d).InvokeActions(null);
}
}
以下是它与情节提要的连接方式:
<TextBlock x:Name="textBlock" Text="{Binding TestProp}" Background="White">
<i:Interaction.Triggers>
<local:DataTriggerPlus Subscription="{Binding TestProp}">
<im:ControlStoryboardAction
Storyboard="{StaticResource Storyboard1}"/>
</local:DataTriggerPlus>
</i:Interaction.Triggers>
</TextBlock>
我非常喜欢这种方法,Blend 3 设计师做得很好!
编辑:回答德鲁评论...
是的,它与 Blend 一起提供。您可以只将 Microsoft.Expression.Interactions.dll 和 System.Windows.Interactivity 包含到您的项目中。
是的,它很冗长(我问过有人在这个问题中是否想出了一个通过样式应用行为的好方法)——但也有灵活性的好处。例如,您不仅可以启动故事板,还可以从同一个触发器切换状态或执行其他操作。