Попытка оживить высоту, но с ошибкой получается, что высота равна NaN - PullRequest
4 голосов
/ 12 июля 2010

Пытался создать анимацию для динамической регулировки высоты. Я нашел эту информацию , которая помогла, но когда я пытаюсь ее использовать, я получаю ошибку: «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:

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

Ответы [ 3 ]

6 голосов
/ 12 июля 2010

Если вы хотите, чтобы высота была динамической, то вы не можете анимировать высоту напрямую: как вы уже видели, если вы не назначите ее явно, WPF попытается выполнить интерполяцию для NaN.
Вместо этого присвойте элементу LayoutTransform и анимировать параметры ScaleX и ScaleY этого преобразования.

1 голос
/ 03 апреля 2014

Поскольку ваш TargetProperty имеет значение Height, вы можете просто установить значение по умолчанию для Height, и оно будет работать.В моем случае, как только я поместил число для высоты на сам фактический элемент управления,

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

, а затем имел анимацию (которая должна была сделать переключение высоты), он работал нормально.

1 голос
/ 23 мая 2012

Вы всегда можете создать прикрепленное свойство для высоты, которое ничего не делает, кроме как установить свойство высоты в целевом элементе управления, таким образом вы можете анимировать, используя 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 вместо высоты на всем, что вы хотите анимировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...