在Silverlight 3中有条件地执行EventTriggers

时间:2010-04-21 13:58:38

标签: silverlight xaml expression-blend

我目前正在处理Silverlight应用程序的UI,并且需要能够在处理相同的事件触发器时根据控件的当前状态将控件的可视状态更改为两种可能状态之一。

例如: 我有一个部分位于剪切路径中的控件,当我单击控件的可见部分时我想将状态更改为“可见”,如果我在处于“可见”状态时再次单击它我想要更改到了“隐藏”状态。

示例XAML:

            <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseLeftButtonUp">
                    <ic:GoToStateAction StateName="Visible"/>
                    <ic:GoToStateAction StateName="Hidden"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>

其中“i”是“System.Windows.Interactivity; assembly = System.Windows.Interactivity”,“ic”是“Microsoft.Expression.Interactivity.Core; assembly = Microsoft.Expression.Interactions”。我目前正在使用Expression Blend 3,并且更愿意只使用XAML解决方案,但如果完全有必要,我不反对编码。我已尝试在Blend中记录目标状态名称的更改,但这不起作用。

对此有何想法?

2 个答案:

答案 0 :(得分:3)

如果只有2个状态,最简单的方法是简单地调用GoToNextState以在状态之间旋转。 E.g:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseLeftButtonUp">
        <si:GoToNextState/>
    </i:EventTrigger>
</i:Interaction.Triggers>

如果您还有其他州,那么:

  • 在基础viewmodel IsVisible
  • 上添加一个属性
  • 有一个触发器,可以调用一个方法(使用CallMethod动作),该方法将切换该属性,即MouseLeftButtonUp
  • DataStateBehavior绑定到IsVisible属性

E.g。像这样的东西:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseLeftButtonUp">
        <si:CallDataMethod Method='ToggleIsVisible'/>
    </i:EventTrigger>
</i:Interaction.Triggers>
<i:Interaction.Behaviors>
    <si:DataStateBehavior Binding='{Binding IsVisible}' Value='True' TrueState='Visible' FalseState='Hidden'/>
</i:Interaction.Behaviors>

答案 1 :(得分:0)

最后,我通过创建一个名为ToggleStateAction的简单自定义操作来实现此目的,以便为我封装此行为。