powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / обратная анимация в WPF
9 сообщений из 9, страница 1 из 1
обратная анимация в WPF
    #38126459
nikich92
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем доброго времени суток. У меня такой вопрос. Требуется сделать программно анимацию в две стороны - одна увеличивает объект, а другая уменьшает. Есть такой код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
private void Click(object sender, MouseButtonEventArgs e)
        {
        var viewBox= sender as Viewbox;
        if (!Flag)
            {
               Flag = true;
                TimeSpan span = TimeSpan.FromMilliseconds(500);
                var width = viewBox.ActualWidth * 10;
                var height = viewBox.ActualHeight * 10;

                var animation = new DoubleAnimation(width, span);
                Storyboard.SetTarget(animation, viewBox);
                Storyboard.SetTargetProperty(animation, new PropertyPath("Width"));
                strBoard.Children.Add(animation);

                animation = new DoubleAnimation(height, span);
                Storyboard.SetTarget(animation, viewBox);
                Storyboard.SetTargetProperty(animation, new PropertyPath("Height"));
                strBoard.Children.Add(animation);
                strBoard.AutoReverse = true;
                strBoard.Duration = span;
                strBoard.Begin();
                strBoard.Seek(span);
                strBoard.Pause();
            }
            else
            {
                strBoard.Resume();
                Flag = false;
             }
     }


и он работает, но не совсем так, как хотелось бы. При увеличении объекта viewBox анимации не происходит, а просто выполняется резкое увеличение объекта. А при обратной анимации (strBoard.Resume()) уменьшение нормально анимируется. Подскажите, пожалуйста, в чем может быть проблема? С анимациями в WPF сталкиваюсь впервые.
...
Рейтинг: 0 / 0
обратная анимация в WPF
    #38126476
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хз. попробовал туда/назад анимирует тормозит/возобновляет без рывков, все плавно. Пробуйте.

Попытка номер раз
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Canvas>
            <Button Click="StartAnimation" Width="100" Height="20" x:Name="zzz" />
            <Button Content="Button" Canvas.Left="334" Canvas.Top="200" Width="75" Click="PauseResume"/>


        </Canvas>
    </Grid>
</Window>



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private Storyboard s;

        private void StartAnimation(object sender, RoutedEventArgs e)
        {
            var ha = new DoubleAnimation();
            ha.To = 100;
            ha.AutoReverse = true;

            var wa = new DoubleAnimation();
            wa.To = 20;
            wa.AutoReverse = true;


            Storyboard.SetTarget(ha, zzz);
            Storyboard.SetTargetProperty(ha, new PropertyPath("Height"));

            Storyboard.SetTarget(wa, zzz);
            Storyboard.SetTargetProperty(wa, new PropertyPath("Width"));

            s = new Storyboard();
            s.AutoReverse = true;
            s.Children.Add(ha);
            s.Children.Add(wa);
            s.Duration = TimeSpan.Parse("0:0:5");
            s.Begin();
        }

        private bool _isPaused = false;
        private void PauseResume(object sender, RoutedEventArgs e)
        {
            if (!_isPaused)
                s.Pause();
            else
                s.Resume();

            _isPaused = !_isPaused;
        }
    }
}

...
Рейтинг: 0 / 0
обратная анимация в WPF
    #38126515
nikich92
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lord BritishХз. попробовал туда/назад анимирует тормозит/возобновляет без рывков, все плавно. Пробуйте.

+
Попытка номер раз
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Canvas>
            <Button Click="StartAnimation" Width="100" Height="20" x:Name="zzz" />
            <Button Content="Button" Canvas.Left="334" Canvas.Top="200" Width="75" Click="PauseResume"/>


        </Canvas>
    </Grid>
</Window>



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private Storyboard s;

        private void StartAnimation(object sender, RoutedEventArgs e)
        {
            var ha = new DoubleAnimation();
            ha.To = 100;
            ha.AutoReverse = true;

            var wa = new DoubleAnimation();
            wa.To = 20;
            wa.AutoReverse = true;


            Storyboard.SetTarget(ha, zzz);
            Storyboard.SetTargetProperty(ha, new PropertyPath("Height"));

            Storyboard.SetTarget(wa, zzz);
            Storyboard.SetTargetProperty(wa, new PropertyPath("Width"));

            s = new Storyboard();
            s.AutoReverse = true;
            s.Children.Add(ha);
            s.Children.Add(wa);
            s.Duration = TimeSpan.Parse("0:0:5");
            s.Begin();
        }

        private bool _isPaused = false;
        private void PauseResume(object sender, RoutedEventArgs e)
        {
            if (!_isPaused)
                s.Pause();
            else
                s.Resume();

            _isPaused = !_isPaused;
        }
    }
}


прошу прощения - может я неправильно изъяснился. У меня тут проблема в том, что при одном нажатии на кнопку объект должен увеличиваться, а при повторном нажатии на неё же - объект должен возвращаться в исходное состояние, т.е. он должен увеличиться и оставаться в таком состоянии, пока с ним производятся какие-то манипуляции. И вот когда происходит увеличение, то он резко изменяет размеры (по идее анимация сразу становится в позицию времени strBoard.Seek(span);), а когда возвращается в исходное состояние, то анимация выполняется нормально. Вот как побороть эту проблему - не знаю. Пробовал способ с сохранением изменяющихся свойств объекта, но в таком случае некоторые объекты после обратной анимации почему-то не становятся в исходное положение (становится выше/ниже либо левее от исходного положения). Альтернативный код вот:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
double  actW, actH;
private void Click(object sender, MouseButtonEventArgs e)
        {
                var viewBox= sender as Viewbox;
                actW = viewBox.ActualWidth;
                actH = viewBox.ActualHeight;
        if (!Flag)
            {
               Flag = true;
                   
                TimeSpan span = TimeSpan.FromMilliseconds(500);
                var width = viewBox.ActualWidth * 10;
                var height = viewBox.ActualHeight * 10;

                var animation = new DoubleAnimation(width, span);
                Storyboard.SetTarget(animation, viewBox);
                Storyboard.SetTargetProperty(animation, new PropertyPath("Width"));
                strBoard.Children.Add(animation);

                animation = new DoubleAnimation(height, span);
                Storyboard.SetTarget(animation, viewBox);
                Storyboard.SetTargetProperty(animation, new PropertyPath("Height"));
                strBoard.Children.Add(animation);

                //strBoard.AutoReverse = true;
                strBoard.Duration = span;
                strBoard.Begin();
               // strBoard.Seek(span);
              //  strBoard.Pause();
            }
            else
            {
                //strBoard.Resume();
                Flag = false;
                strBoard = new Storyboard();
               
                var anima1 = new DoubleAnimation(actW, span);
                Storyboard.SetTarget(anima1, viewBox);
                Storyboard.SetTargetProperty(anima1, new PropertyPath("Width"));
                strBoard.Children.Add(anima1);
                anima1 = new DoubleAnimation(actH, span);
                Storyboard.SetTarget(anima1, viewBox);
                Storyboard.SetTargetProperty(anima1, new PropertyPath("Height"));
                strBoard.Children.Add(anima1);
                strBoard.Begin();
             }
     }
...
Рейтинг: 0 / 0
обратная анимация в WPF
    #38126534
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оно, не?
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Canvas>
            <Button Click="bt1clck" Width="100" Height="20" x:Name="zzz">Сначала меня</Button>
            <Button Canvas.Left="200" Canvas.Top="200" Width="75" Click="bt2clck">Потом меня</Button>


        </Canvas>
    </Grid>
</Window>



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private Storyboard s;

        private void bt1clck(object sender, RoutedEventArgs e)
        {
            var ha = new DoubleAnimation();
            ha.To = 100;

            var wa = new DoubleAnimation();
            wa.To = 20;


            Storyboard.SetTarget(ha, zzz);
            Storyboard.SetTargetProperty(ha, new PropertyPath("Height"));

            Storyboard.SetTarget(wa, zzz);
            Storyboard.SetTargetProperty(wa, new PropertyPath("Width"));

            s = new Storyboard();
            //s.AutoReverse = true;
            s.Children.Add(ha);
            s.Children.Add(wa);
            s.Duration = TimeSpan.Parse("0:0:5");
            s.AutoReverse = true;
            s.RepeatBehavior = new RepeatBehavior(TimeSpan.Parse("0:0:2.5"));
            s.Begin();
        }

        private void bt2clck(object sender, RoutedEventArgs e)
        {
            var ha = new DoubleAnimation();
            ha.To = 20;

            var wa = new DoubleAnimation();
            wa.To = 100;


            Storyboard.SetTarget(ha, zzz);
            Storyboard.SetTargetProperty(ha, new PropertyPath("Height"));

            Storyboard.SetTarget(wa, zzz);
            Storyboard.SetTargetProperty(wa, new PropertyPath("Width"));

            s = new Storyboard();
            //s.AutoReverse = true;
            s.Children.Add(ha);
            s.Children.Add(wa);
            s.Duration = TimeSpan.Parse("0:0:5");
            s.AutoReverse = true;
            s.Seek(TimeSpan.Parse("0:0:2.5"));
            s.Begin();
        }
    }
}

...
Рейтинг: 0 / 0
обратная анимация в WPF
    #38126562
nikich92
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lord British+
Оно, не?
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Canvas>
            <Button Click="bt1clck" Width="100" Height="20" x:Name="zzz">Сначала меня</Button>
            <Button Canvas.Left="200" Canvas.Top="200" Width="75" Click="bt2clck">Потом меня</Button>


        </Canvas>
    </Grid>
</Window>



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private Storyboard s;

        private void bt1clck(object sender, RoutedEventArgs e)
        {
            var ha = new DoubleAnimation();
            ha.To = 100;

            var wa = new DoubleAnimation();
            wa.To = 20;


            Storyboard.SetTarget(ha, zzz);
            Storyboard.SetTargetProperty(ha, new PropertyPath("Height"));

            Storyboard.SetTarget(wa, zzz);
            Storyboard.SetTargetProperty(wa, new PropertyPath("Width"));

            s = new Storyboard();
            //s.AutoReverse = true;
            s.Children.Add(ha);
            s.Children.Add(wa);
            s.Duration = TimeSpan.Parse("0:0:5");
            s.AutoReverse = true;
            s.RepeatBehavior = new RepeatBehavior(TimeSpan.Parse("0:0:2.5"));
            s.Begin();
        }

        private void bt2clck(object sender, RoutedEventArgs e)
        {
            var ha = new DoubleAnimation();
            ha.To = 20;

            var wa = new DoubleAnimation();
            wa.To = 100;


            Storyboard.SetTarget(ha, zzz);
            Storyboard.SetTargetProperty(ha, new PropertyPath("Height"));

            Storyboard.SetTarget(wa, zzz);
            Storyboard.SetTargetProperty(wa, new PropertyPath("Width"));

            s = new Storyboard();
            //s.AutoReverse = true;
            s.Children.Add(ha);
            s.Children.Add(wa);
            s.Duration = TimeSpan.Parse("0:0:5");
            s.AutoReverse = true;
            s.Seek(TimeSpan.Parse("0:0:2.5"));
            s.Begin();
        }
    }
}


таким способом некоторые контролы при обратной анимации почему-то не на свое место становятся (сдвигаются вверх, вниз либо влево)
...
Рейтинг: 0 / 0
обратная анимация в WPF
    #38126583
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikich92,

Вполне возможно, это зависит от вашего Layout, кто-то подвинется, кто-то сожмется/вытянется.
...
Рейтинг: 0 / 0
обратная анимация в WPF
    #38126594
nikich92
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lord Britishnikich92,

Вполне возможно, это зависит от вашего Layout, кто-то подвинется, кто-то сожмется/вытянется.
у меня там несколько элементов viewbox внутри канваса находятся. Просто некоторые элементы нормально анимируются таким способом, а некоторые смещаются после обратной анимации.
...
Рейтинг: 0 / 0
обратная анимация в WPF
    #38126597
nikich92
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lord British, попробовал поставить AutoReverse в true - увидел, что viewbox возвращается в исходное положение нормально. Потом сделал таким способом, как написал в первом сообщении - все нормально, только появляется описанная выше проблема: при анимации увеличения объект резко увеличивается, а при обратной анимации объект плавно возвращается в исходное состояние.
...
Рейтинг: 0 / 0
обратная анимация в WPF
    #38126599
nikich92
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кому интересно - выше описанный способ я взял отсюда http://stackoverflow.com/questions/5552124/wpf-can-the-animation-reverse-be-invoked-explicitly
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / обратная анимация в WPF
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]