Silverlight:如何为模板化/自定义控件创建VisualState

时间:2011-10-14 06:46:15

标签: silverlight custom-controls controltemplate visualstates

我正在尝试在Silverlight中创建模板化/自定义控件。

基本控件可以是System.Windows.Controls.Button。该按钮具有以下可视状态:

<vsm:VisualStateManager.VisualStateGroups>
    <!--Define the states for the common states. The states in a 
                            VisualStateGroup are mutually exclusive to each other.-->
    <vsm:VisualStateGroup x:Name="CommonStates">
        <!--Define the VisualStates in this VistualStateGroup.-->
        <vsm:VisualState x:Name="Normal"/>
        <vsm:VisualState x:Name="MouseOver" />
        <vsm:VisualState x:Name="Pressed" />
        <vsm:VisualState x:Name="Disabled" />
    </vsm:VisualStateGroup>
    <!--Define the states for the focus states. The states in a 
                            VisualStateGroup are mutually exclusive to each other.-->
    <vsm:VisualStateGroup x:Name="FocusStates">
        <!--Define the VisualStates in this VistualStateGroup.-->
        <vsm:VisualState x:Name="Focused" />
        <vsm:VisualState x:Name="Unfocused" />
    </vsm:VisualStateGroup>
</vsm:VisualStateManager.VisualStateGroups>

我的自定义控件需要另一个状态MouseButtonUpMouseButtonDown可由预定义的Pressed状态表示)。这里,默认情况下MouseButtonUp状态将被解释为MouseOver状态,但我希望MouseButtonUp状态 行为与MouseOver州的行为不同。

如何添加此MouseButtonUp视觉状态? (MouseButtonUp状态仅在用户释放鼠标之后和用户开始移动之前存在。

BTW:我应该使用自定义控制还是用户控制?我对这两个人一直很困惑。看起来他们两个都可以在很多情况下工作。

非常感谢。

更新:一旦我们添加了这个MouseButtonUp状态,我就可以进行视觉转换,如:

<vsm:VisualTransition From="Pressed" To="MouseButtonUp" GeneratedDuration="0:0:5" />

或者:

<vsm:VisualTransition From="MouseButtonUp" To="MouseOver" GeneratedDuration="0:0:5" />

1 个答案:

答案 0 :(得分:2)

以下行在您的xaml中为您创建一个视觉状态。

    <vsm:VisualState x:Name="MouseButtonUp">
        ...Your code for animation
    </vsm:VisualState>

这不是全部。除非您强制执行控件转到此Visual-State,否则它是无用的。那你怎么做的?这是怎么回事。

    VisualStateManager.GoToState(this, "MouseButtonUp", true);

上面的代码将执行您在xaml中的“MouseButtonUp”VisualState定义中定义的任何动画。只要您认为鼠标具有MousebuttonUp状态,就可以调用上面的代码语句。