WPF анимация изменчива - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь использовать некоторые анимации, чтобы мое приложение чувствовало себя хорошо. Но я не мог помочь изменчивой анимации, что независимо от того, что я делаю, это всегда заканчивается заиканием.

Взгляните:

DoubleAnimation anim = new DoubleAnimation()
                 {
//ht is height of DockPanel, I wanted to start from 200 less than Actual DockPanel Height
                         From = ht - 200,
                         To = ht,
                         Duration = TimeSpan.FromSeconds(1),
                         AccelerationRatio = 0.5,
                         DecelerationRatio = 0.5
                     };
    x.BeginAnimation(HeightProperty, anim);
    //x is the UserControl

Кроме того, мне нужно анимировать пользовательский UserControl , который содержит некоторый текст, например, 100 слов и набор изображений . Я просто хочу, чтобы он вырос до высоты текущего DockPanel , как только он будет загружен.

При поиске решения я увидел следующее:

Timeline.SetDesiredFrameRate(anim, 10);

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

1 Ответ

0 голосов
/ 01 мая 2019

Частота кадров подобна частоте кадров фильма.

Низкая частота кадров даст вам прерывистый фильм или прерывистую анимацию.

Использование док-панели, вероятно, является плохой идеей для некоторыхконтент, который вы собираетесь анимировать, потому что он будет пытаться настраивать вещи каждый раз, когда ваш рост меняется.

Я предлагаю вместо этого использовать сетку.

Вам следует использовать масштабирование.Частично потому, что, когда вы оживите высоту, вы обнаружите, что все содержимое вашего usercontrol лишено своих мер и они захотят запустить весь цикл аранжировки много раз.

Если вы думаете, аранжировка меры?Затем прочитайте о том, как работает система макетов wpf.

Я бы также посоветовал вам использовать xaml, а не код.

Вот некоторый код для размышлений:

    private void StartAnimate_Click(object sender, RoutedEventArgs e)
    {
        var tran = testRectangle.RenderTransform = new ScaleTransform(1d, 1d)
        {
            CenterX = 0.5d,
            CenterY = 0.5d
        };
        var anim = new DoubleAnimation
        {
            To = 1.0,
            From=0,
            Duration = TimeSpan.FromSeconds(0.5d),
            DecelerationRatio = 0.5d,
            FillBehavior = FillBehavior.Stop
        };
        tran.BeginAnimation(
             ScaleTransform.ScaleYProperty,
             anim,
             HandoffBehavior.Compose);
    }

Я помещаю прямоугольник и мою кнопку в док-панель, чтобы доказать, что это работает.

<DockPanel>
    <Rectangle Fill="Blue" Name="testRectangle"
               Width="500"
    />
    <Button Content="Animate"
            HorizontalAlignment="Center"
            VerticalAlignment="Center"
            Name="StartAnimate"
            Click="StartAnimate_Click"  />
</DockPanel>

Прямоугольник довольно прост, но он плавно анимируется.

...