UserControl为ListBoxItem和IsSelected

时间:2010-05-02 21:40:19

标签: wpf xaml expression-blend

我有一个usercontrol,我想用作ListBoxItem。

<ListBox.ItemTemplate>
     <DataTemplate>
          <local:MyUserControl/>
     </DataTemplate>
</ListBox.ItemTemplate>

我想在取消选择usercontrol时播放故事板。

<UserControl.Resources>
     <Style TargetType="{x:Type UserControl}">
          <Style.Triggers>
               <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}, Mode=FindAncestor}}" Value="False">
                    <DataTrigger.EnterActions>
                         <BeginStoryboard Storyboard="{StaticResource OnMouseLeaveSB}"/>
                    </DataTrigger.EnterActions>
               </DataTrigger>
          </Style.Triggers>
     </Style>
 </UserControl.Resources>

但故事板永远不会开火。有更好的方法吗?

编辑添加:

我真正想要实现这个目标:

当鼠标在UserControl上时,我想播放一个故事板(OnMouseEnterSB)。当鼠标离开UserControl时,我想播放另一个故事板(OnMouseLeaveSB)。我把这一切都搞好了。

然而,当选择UserControl并且鼠标离开时,我不想播放故事板。

最后,当取消选择UserControl时,我想播放OnMouseLeaveSB故事板。

2 个答案:

答案 0 :(得分:1)

我没有WPF经验,而是我是Silverlgiht女孩,而在Silverlight中,你所描述的东西被称为“VisualStateManager”(只是将它绑定,它也可以在WPF中使用)。

使用VSM,您可以为(用户)控件的每个“状态”(鼠标悬停,鼠标左移,正常)定义不同的视觉外观,并且还可以根据前一个和/或下一个状态定义这些状态之间的不同过渡(或者您可以使用默认转换在所有不同状态之间移动)。

阅读Tim Heuer的this博客文章。用很多截图来描述它:)。您可能还想查看此link

使用VSM,状态和动画是控件的一部分,而不是具有一堆事件处理程序和animation.Begin()调用的应用程序。我非常喜欢并推荐它:)

答案 1 :(得分:1)

如果我理解你的问题,你想在任何ListViewItem失去选择时播放这个动画'OnMouseLeaveSB'。但是在触发器中,您正在为所有未选择的项目播放动画。因此,即使这样有效,也不会是你想要的那个。

故事板无法触发的原因是默认的BlueHighlight会隐藏您的动画。解决这个问题的方法是设置边框颜色,这里解释www.HereIsYourLink.com

要实现您的目标,您必须在Trigger.ExitActions中插入故事板,其中IsSelected值为“True”。

如果你不赶时间,请看看VSM。