2010-09-11 82 views
1

我的问题很简单:它甚至有可能吗?动画从相互排斥的VisualStateGroups动画相同的属性

假设我想要设置ListBoxItem的样式,使其默认情况下具有黑色前景,选择时为蓝色,鼠标移过时为红色。我结束了这样的事情:

<!-- assume the default foreground color is black --> 
<ControlTemplate TargetType="ListBoxItem"> 
    <Grid Background="{TemplateBinding Background}"> 
     <VisualStateManager.VisualStateGroups> 
      <VisualStateGroup x:Name="CommonStates"> 
       <VisualState x:Name="Normal"/> 

       <VisualState x:Name="MouseOver"> 
        <Storyboard> 
         <ColorAnimation Duration="0:0:0.2" To="Red" Storyboard.TargetName="contentControl" Storyboard.TargetProperty="(Control.Foreground).(SolidColorBrush.Color)"/> 
        </Storyboard> 
       </VisualState> 
      </VisualStateGroup> 

      <VisualStateGroup x:Name="SelectionStates"> 
       <VisualState x:Name="Unselected"/> 

       <VisualState x:Name="Selected"> 
        <Storyboard> 
         <ColorAnimation Duration="0:0:0.2" To="Blue" Storyboard.TargetName="contentControl" Storyboard.TargetProperty="(Control.Foreground).(SolidColorBrush.Color)"/> 
        </Storyboard> 
       </VisualState> 
      </VisualStateGroup> 
     </VisualStateManager.VisualStateGroups> 

     <ContentControl x:Name="contentControl" Foreground="{TemplateBinding Foreground}" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}"/> 
    </Grid> 
</ControlTemplate> 

的问题是,ListBoxItem类已正确放置选择状态在自己的视觉状态组,独立于常见的状态,如鼠标。这意味着ListBoxItem可以处于选定状态和鼠标悬停状态。

如果选择了ListBoxItem并正确显示为蓝色,将鼠标移到黑色上会将其恢复为黑色,因为它会转换回正常状态。

有没有什么方法可以帮助我处理这个问题,而无需通过子类化ListBoxItem并添加我自己的自定义状态?我读过的所有内容都表明这不可能,但对我来说似乎有点可笑。我错过了什么?

回答

3

你基本上要求Foreground在同一时间是黑色和蓝色。现在,这是不可能的。如果单个状态具有优先级,则可以解决冲突,如MouseOver> Selected> Normal> Unselected。但它会给已经复杂的视觉状态管理器带来不必要的复杂性。通常情况下,这种情况通过添加新元素并在冲突状态组之一中为该元素的属性设置动画来解决。

+0

+1优先级是什么,我问了 - 不是魔术;) – 2010-09-11 21:08:33