目前,我正在做一些实验。我目前的情况:我有一个StoryBoard可以在2个UserControl之间进行转换(例如,它缩小了当前的UserControl,然后增长了另一个)。
我想要做的是将2个UserControls定义为XAML的一部分,使用“Current”和“Next”键。 Current应绑定到当前查看的UserControl。 Next应该在转换之前绑定,因此StoryBoard知道要转换到哪个元素。这就是我被困的地方:完全使用XAML,怎么会这样呢?
我有一个简单的StoryBoard,它是ItemsControl的资源,以及两个UserControl项目:
<ItemsControl.Resources>
<Storyboard x:Key="TransitionStoryboard">
<!-- Shrink this one. -->
<DoubleAnimation Storyboard.Target="{Binding Current}" Storyboard.TargetProperty="Width" To="0" Duration="0:0:1"/>
<!--Grow the next.-->
<DoubleAnimation Storyboard.Target="{Binding Next}" Storyboard.TargetProperty="Width" To="100" BeginTime="0:0:1" Duration="0:0:1"/>
</Storyboard>
<UserControl x:Key="Current"/>
<UserControl x:Key="Next" Width="0"/>
</ItemsControl.Resources>
所以,当我定义一个属于ItemsControl的新UserControl时(如下所示):
<my:Control1 x:Name="ControlOne"/>
如何将“当前”UserControl设置为ControlOne?然后,当我想要转换时,如何将其设置为“下一步”?如何在触发后更改这些?
由于
答案 0 :(得分:2)
这是一团糟。您似乎完全误解了静态资源的使用方式。
要实现您想要做的事情,您应该首先决定触发动画的内容。理想情况下,控件上应该是DependencyProperty
,或者是视图模型上的属性(实现INotifyPropertyChanged
)。例如,您可以声明IsSelected
属性。然后你应该创建一个样式,当选择控件时触发“增长”动画,并在控件失去选择时触发“缩小”动画。
例如:
<Style TargetType="Control" x:Key="FancyStyle">
<Style.Triggers>
<DataTrigger Binding={Binding IsSelected} Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource YourGrowAnim}"/>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource YourShrinkAnim}"/>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
然后您应该将该样式分配给每个控件,您希望以这种方式设置动画并设置IsSelected属性之间的过渡。您也可以使用EventTrigger
代替动画并将动画绑定到事件(例如,当控件获得/失去焦点时,您可以触发这些动画。)
你也应该修复你的“成长”动画,它很可能无法正常工作。