WPF将UserControl绑定到资源

时间:2013-09-27 10:24:10

标签: c# wpf xaml

目前,我正在做一些实验。我目前的情况:我有一个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?然后,当我想要转换时,如何将其设置为“下一步”?如何在触发后更改这些?

由于

1 个答案:

答案 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代替动画并将动画绑定到事件(例如,当控件获得/失去焦点时,您可以触发这些动画。)

你也应该修复你的“成长”动画,它很可能无法正常工作。