【问题标题】:WPF Bind UserControl to resourceWPF 将 UserControl 绑定到资源
【发布时间】:2013-09-27 19:22:29
【问题描述】:

目前,我正在做一些实验。我当前的场景:我有一个 StoryBoard 在 2 个 UserControl 之间进行转换(例如,它缩小了当前的 UserControl,然后增大了另一个)。

我想要做的是将 2 个用户控件定义为 XAML 的一部分,键为“当前”和“下一个”。 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"/>

如何将“当前”用户控件顶部设置为 ControlOne?那么,当我想过渡时,如何将一个设置为“下一步”?触发后如何更改这些?

谢谢

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    这真是一团糟。您似乎完全误解了如何使用静态资源。

    要实现你想要做的事情,你应该首先决定什么会触发动画。理想情况下,它应该是控件上的一些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 并将动画绑定到事件(例如,您可以在控件获得/失去焦点时触发这些动画)。

    你还应该修复你的“成长”动画,它很可能不起作用。

    【讨论】:

    • 这是一个很好的答案,谢谢。它以完全不同的方式实现了我想要做的事情。至于你的前几句话——哎呀!是的,我承认你是对的。你知道 WPF 的好资源吗?我发现他们中的大多数缺乏凝聚力,或者他们解释了如何做某事而没有解释它为什么起作用。
    猜你喜欢
    • 2014-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    相关资源
    最近更新 更多