试图设置高度动画,但得到高度为NaN的错误

时间:2010-07-12 16:12:07

标签: wpf animation

尝试创建动画以动态调整高度。我发现this info有帮助,但当我尝试使用它时,我收到一个错误:'System.Windows.Media.Animation.DoubleAnimation'不能使用'NaN'的默认目标值。

如果我指定高度,我会收到该错误。

风格:

<Style x:Key="bdrSlideIn"
   TargetType="{x:Type Border}">
        <Style.Resources>
            <Storyboard x:Key="storyBoardIn">
                <DoubleAnimation BeginTime="00:00:00"
                                 From="0"
                                 Duration="00:00:00.65"
                                 Storyboard.TargetName="{x:Null}"
                                 Storyboard.TargetProperty="(FrameworkElement.Height)"
                                 DecelerationRatio="1" />
            </Storyboard>

            <Storyboard x:Key="storyBoardOut">
                <DoubleAnimation BeginTime="00:00:00"
                                 To="0"
                                 Duration="00:00:00.65"
                                 Storyboard.TargetName="{x:Null}"
                                 Storyboard.TargetProperty="(FrameworkElement.Height)"
                                 AccelerationRatio="1" />
            </Storyboard>
        </Style.Resources>

        <Style.Triggers>
            <DataTrigger Binding="{Binding SearchExecuted}"
                         Value="True">
                <DataTrigger.EnterActions>
                    <BeginStoryboard Storyboard="{StaticResource storyBoardIn}"
                                     Name="SlideStoryboard" />
                </DataTrigger.EnterActions>
                <DataTrigger.ExitActions>
                    <BeginStoryboard Storyboard="{StaticResource storyBoardOut}" />
                </DataTrigger.ExitActions>
            </DataTrigger>
        </Style.Triggers>
    </Style>

边框:

<Border VerticalAlignment="Top"
    Style="{StaticResource bdrSlideIn}">
        <WPFToolKit:DataGrid Name="dgSearchResults"
                             ItemsSource="{Binding SearchResults}"
                             MaxHeight="280"
                             VerticalAlignment="Top">...

3 个答案:

答案 0 :(得分:6)

如果你想保持高度动态,那么就不能直接为Height设置动画:正如你所见,除非你明确指定它,否则WPF会尝试插值到NaN。
相反,给你的元素一个LayoutTransform&lt ; ScaleTransform /&gt;,并为该转换的ScaleX和ScaleY参数设置动画。

答案 1 :(得分:1)

除了在目标控件上设置height属性之外,您总是可以为高度创建附加属性,这样您就可以在附加属性上使用To进行动画处理。

public class AnimatedPanelBehavior
{
   public static double GetAnimatedHeight(DependencyObject obj)
   {
      return (double)obj.GetValue(AnimatedHeightProperty);
   }

   public static void SetAnimatedHeight(DependencyObject obj, double value)
   {
      obj.SetValue(AnimatedHeightProperty, value);
   }

   public static readonly DependencyProperty AnimatedHeightProperty =
            DependencyProperty.RegisterAttached("AnimatedHeight", typeof(double), typeof(AnimatedPanelBehavior), new UIPropertyMetadata(0d, new PropertyChangedCallback((s, e) =>
   {
       FrameworkElement sender = s as FrameworkElement;
       sender.Height = (double)e.NewValue;
   })));
}

然后为它制作动画,你会使用普通的动画,现在只是尝试它并且它工作正常,但我没有进一步调查,而是“它的工作原理”。

<DoubleAnimation Storyboard.TargetProperty="(local:AnimatedPanelBehavior.AnimatedHeight)" To="100" Duration="0:0:5"/>

在您希望能够制作动画的任何内容上使用AnimatedHeight而不是height。

答案 2 :(得分:1)

由于您的TargetProperty是高度,您只需设置一个默认值Height即可。在我的情况下,只要我为实际控制本身设置了一个高度数字,

<TextBlock Height="30"  ..
  <TextBlock Style ..
     ... 
       <StoryBoard ..

然后有动画(要切换高度)它工作正常。