状态迁移(State Transitions) eåbÉ7\forum.entlib.net.cn}È*Jêm\eåbÉ7\forum.entlib.net.cn}È*Jêm\ 状态迁移是指控件从一个状态过渡到另外一个状态,如Button控件从MouseOver状态到Pressed状态这个过渡过程,通过Storyboard来定义的动画。
eåbÉ7\forum.entlib.net.cn}È*Jêm\eåbÉ7\forum.entlib.net.cn}È*Jêm\
eåbÉ7\forum.entlib.net.cn}È*Jêm\ 状态迁移在Silverlight 2中使用VisualTransition类来表示,它的定义如下代码所示:
eåbÉ7\forum.entlib.net.cn}È*Jêm\eåbÉ7\forum.entlib.net.cn}È*Jêm\public class VisualTransition
eåbÉ7\forum.entlib.net.cn}È*Jêm\{
eåbÉ7\forum.entlib.net.cn}È*Jêm\public VisualTransition();
eåbÉ7\forum.entlib.net.cn}È*Jêm\public Duration Duration { get; set; }
eåbÉ7\forum.entlib.net.cn}È*Jêm\public string From { get; set; }
eåbÉ7\forum.entlib.net.cn}È*Jêm\public Storyboard Storyboard { get; set; }
eåbÉ7\forum.entlib.net.cn}È*Jêm\public string To { get; set; }
eåbÉ7\forum.entlib.net.cn}È*Jêm\}
eåbÉ7\forum.entlib.net.cn}È*Jêm\状态组(StateGroups)
eåbÉ7\forum.entlib.net.cn}È*Jêm\eåbÉ7\forum.entlib.net.cn}È*Jêm\ 状态组,是把控件所有互斥的状态放在同一个组中,这样一个状态它只能位于一个组中,所谓的互斥是指控件不肯能同时具有该组中的两种状态,如Checked和Unchecked两个状态不可能同时存在。以CheckBox控件为例,我们来看一下它的状态组:
eåbÉ7\forum.entlib.net.cn}È*Jêm\eåbÉ7\forum.entlib.net.cn}È*Jêm\
eåbÉ7\forum.entlib.net.cn}È*Jêm\eåbÉ7\forum.entlib.net.cn}È*Jêm\ 从上表中我们可以看到,对于CheckBox控件来说,它有三个状态组:FocusStates、CommonStates、CheckStates。一个CheckBox控件可以同时为Focused、MouseOver和Indeterminate状态,因为它们处在不同的状态组。现在对于这个问题:
eåbÉ7\forum.entlib.net.cn}È*Jêm\eåbÉ7\forum.entlib.net.cn}È*Jêm\ “CheckBox控件的状态是什么?”答案应该由三部分组成,分别为三个状态组中的一个。状态组是在Silverlight 2中提出的一个新的概念,它由VisualStateGroup类来提供,其中除了状态组名属性外,维护了一个视觉状态的集合和一个状态迁移的集合,如下代码所示:
eåbÉ7\forum.entlib.net.cn}È*Jêm\eåbÉ7\forum.entlib.net.cn}È*Jêm\eåbÉ7\forum.entlib.net.cn}È*Jêm\public sealed class VisualStateGroup : DependencyObject
eåbÉ7\forum.entlib.net.cn}È*Jêm\{
eåbÉ7\forum.entlib.net.cn}È*Jêm\public VisualStateGroup();
eåbÉ7\forum.entlib.net.cn}È*Jêm\public string Name { get; }
eåbÉ7\forum.entlib.net.cn}È*Jêm\public Collection<VisualState> States { get; set; }
eåbÉ7\forum.entlib.net.cn}È*Jêm\public Collection<VisualTransition> Transitions { get; set; }
eåbÉ7\forum.entlib.net.cn}È*Jêm\}
eåbÉ7\forum.entlib.net.cn}È*Jêm\eåbÉ7\forum.entlib.net.cn}È*Jêm\ 使用状态组是一个非常棒的模型,在Beta 1中,CheckBox控件有12种状态(其中Focus在Beta 1中是作为部件而不是状态),这12种状态是通过CommonStates和CheckStates组合而成的,如PressedUnchecked、 MouseOverChecked等,而在Beta 2中,加上FocusStates状态,CheckBox控件总共只有10种状态。
eåbÉ7\forum.entlib.net.cn}È*Jêm\ eåbÉ7\forum.entlib.net.cn}È*Jêm\ 控件的状态和状态组是通过TemplateVisualState特性来声明的,如在CheckBox控件中的声明如下代码所示:
eåbÉ7\forum.entlib.net.cn}È*Jêm\eåbÉ7\forum.entlib.net.cn}È*Jêm\eåbÉ7\forum.entlib.net.cn}È*Jêm\[TemplateVisualStateAttribute(Name = "ContentFocused", GroupName = "FocusStates")]
eåbÉ7\forum.entlib.net.cn}È*Jêm\[TemplateVisualStateAttribute(Name = "MouseOver", GroupName = "CommonStates")]
eåbÉ7\forum.entlib.net.cn}È*Jêm\[TemplateVisualStateAttribute(Name = "Focused", GroupName = "FocusStates")]
eåbÉ7\forum.entlib.net.cn}È*Jêm\[TemplateVisualStateAttribute(Name = "Checked", GroupName = "CheckStates")]
eåbÉ7\forum.entlib.net.cn}È*Jêm\[TemplateVisualStateAttribute(Name = "Unchecked", GroupName = "CheckStates")]
eåbÉ7\forum.entlib.net.cn}È*Jêm\[TemplateVisualStateAttribute(Name = "Indeterminate", GroupName = "CheckStates")]
eåbÉ7\forum.entlib.net.cn}È*Jêm\[TemplateVisualStateAttribute(Name = "Pressed", GroupName = "CommonStates")]
eåbÉ7\forum.entlib.net.cn}È*Jêm\[TemplateVisualStateAttribute(Name = "Disabled", GroupName = "CommonStates")]
eåbÉ7\forum.entlib.net.cn}È*Jêm\[TemplateVisualStateAttribute(Name = "Unfocused", GroupName = "FocusStates")]
eåbÉ7\forum.entlib.net.cn}È*Jêm\[TemplateVisualStateAttribute(Name = "Normal", GroupName = "CommonStates")]
eåbÉ7\forum.entlib.net.cn}È*Jêm\public class CheckBox : ToggleButton
eåbÉ7\forum.entlib.net.cn}È*Jêm\{
eåbÉ7\forum.entlib.net.cn}È*Jêm\// ......
eåbÉ7\forum.entlib.net.cn}È*Jêm\}
eåbÉ7\forum.entlib.net.cn}È*Jêm\