数据触发wpf和动画

时间:2014-08-16 07:38:23

标签: c# wpf animation triggers

我正在处理从按钮派生的自定义控件,我有2列定义列0设置为网格长度*,列1设置为自动。 第0列中有一些控件并且工作正常,第1列有一个宽度设置为0的网格,这都是在控件模板中设置的。 我制作的自定义控件有几个我放入的依赖属性,其中一个是bool类型,例如IsShowingInfoPlane,默认值为false,id就像在第1列宽度的网格上附加一个双动画到这个依赖属性所以如果它的true运行动画从0到150,如果它的假运行从150到0,那么在第1列中,默认值为0。 我确定我必须沿着数据触发路线走,因为样式不接受动画。

这是按钮的依赖属性

 public bool IsShowingInfoPlane
    {
        get { return (bool)GetValue(IsShowingInfoPlaneProperty); }
        set
        {
            SetValue(IsShowingInfoPlaneProperty, value);
            OnPropertyChanged("IsShowingInfoPlane");
        }
    }

这里是我试图附加到第1列中网格的数据触发器,我希望在其宽度属性上设置动画

<Grid.Triggers>
    <DataTrigger Binding="{TemplateBinding IsShowingInfoPlane}" Value="True" >
         <DataTrigger.EnterActions>
              <BeginStoryboard>
                    <Storyboard>
                         <DoubleAnimation Duration="0:0:0.150" From="{Binding ElementName=InfoGrid, Path=Width}" To="150" Storyboard.TargetProperty="Width" />
                     </Storyboard>
               </BeginStoryboard>
          </DataTrigger.EnterActions>
    </DataTrigger>
</Grid.Triggers>

由于我将在前端设置许多这些按钮,我不想创建单独的动画,因为我用这个按钮到目前为止,我不能去使用其他人控制。 我已经在程序的其他地方使用了动画并取得了成功,但这是我第一次尝试将它们与触发器一起使用,通常我可以从代码中将它们附加到某些控件上, 任何帮助将不胜感激。

此致

1 个答案:

答案 0 :(得分:0)

你无法绑定From&amp;对于Storyboard中的属性,Storyboard必须是freezable。

无论如何,你需要一个EnterAction(就像你一样)来处理True值,并且需要一个ExitAction来表示False值。

请记住,故事板一旦启动就不会停止,直到你说要停止(如果我错了,请纠正我)。您需要在EnterAction中的Storyboard的ExitAction中添加一个StopStoryboard来停止它(同样的事情,你需要在你的ExitAction中的故事板的EnterAction中添加一个StopStoryboard)。

XAML看起来像这样(没有测试代码):

    <Grid.Triggers>
        <DataTrigger Binding="{TemplateBinding IsShowingInfoPlane}" Value="True" >
             <DataTrigger.EnterActions>
                  <StopStoryboard BeginStoryboardName="SbExitAction"/>
                  <BeginStoryboard x:Name="SbEnterAction">
                        <Storyboard>
                            <DoubleAnimation Duration="0:0:0.150" From="0" To="150" Storyboard.TargetProperty="Width" />
                        </Storyboard>
                   </BeginStoryboard>
              </DataTrigger.EnterActions>

              <DataTrigger.ExitActions>
                  <StopStoryboard BeginStoryboardName="SbEnterAction"/>
                  <BeginStoryboard x:Name="SbExitAction">
                        <Storyboard>
                            <DoubleAnimation Duration="0:0:0.150" From="150" To="0" Storyboard.TargetProperty="Width" />
                        </Storyboard>
                   </BeginStoryboard>
                </DataTrigger.ExitActions>
        </DataTrigger>
    </Grid.Triggers>