powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Запустить анимацию во время другой анимации
18 сообщений из 18, страница 1 из 1
Запустить анимацию во время другой анимации
    #38870850
Slant-shadow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Как можно во время выполнения одной анимации прервать ее и начать выполнение второй анимации с этого же места?

Код: 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.
82.
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();
            da.Completed += OnComplitedAnimationGrid_green;
            da.Completed += OnComplitedAnimationGrid_darkviolet;
        }
        DoubleAnimation da = new DoubleAnimation();
        public double mwidth { get { return main_grid.ActualWidth; } }
        public bool fl1 = true;
        public bool fl2 = false;
        private Duration timeAnimation = new Duration(new TimeSpan(0, 0, 0, 2));
 
        private void OnComplitedAnimationGrid_green(object sender, EventArgs e)
        {
 
            grid_green.RenderTransform = new TranslateTransform(); 
            grid_green.Visibility = Visibility.Visible;
            fl2 = true;
            fl1 = false;
        }
 
        private void OnComplitedAnimationGrid_darkviolet(object sender, EventArgs e)
        {
            grid_darkviolet.RenderTransform = new TranslateTransform();
            grid_darkviolet.Visibility = Visibility.Collapsed;
            fl1 = true;
            fl2 = false;
        }
 
        private void MoveGrids(object sender, RoutedEventArgs e)
        {
            if (fl1)
            {
                da = new DoubleAnimation(mwidth, 0, timeAnimation); 
                grid_darkviolet.RenderTransform = new TranslateTransform();
                grid_darkviolet.RenderTransform.BeginAnimation(TranslateTransform.XProperty, da); 
                grid_darkviolet.Visibility = Visibility.Visible;
 
                da = new DoubleAnimation(0, -mwidth, timeAnimation); 
                da.Completed += OnComplitedAnimationGrid_green;
                grid_green.RenderTransform = new TranslateTransform();
                grid_green.RenderTransform.BeginAnimation(TranslateTransform.XProperty, da); 
            }
 
            if (fl2)
            {
                da = new DoubleAnimation(-mwidth, 0, timeAnimation);
                grid_green.RenderTransform = new TranslateTransform();
                grid_green.RenderTransform.BeginAnimation(TranslateTransform.XProperty, da);
                grid_green.Visibility = Visibility.Visible;
 
                da = new DoubleAnimation(0, mwidth, timeAnimation);
                da.Completed += OnComplitedAnimationGrid_darkviolet;
                grid_darkviolet.RenderTransform = new TranslateTransform();
                grid_darkviolet.RenderTransform.BeginAnimation(TranslateTransform.XProperty, da);
            }
        }
    }
}         



Код: 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 x:Name="main_grid">
        <ToggleButton Width="90" Height="45" HorizontalAlignment="Left" VerticalAlignment="Top" Content="&gt; &lt;" Click="MoveGrids"></ToggleButton>
        <Grid>
 
            <Grid x:Name="grid_green"  Height="200" Width="350" Background="SeaGreen" Margin="0,0,0,0"></Grid>
        <Grid x:Name="grid_darkviolet"  Height="200" Width="350" Background="DarkViolet" Margin="0,0,0,0" Visibility="Collapsed"></Grid>
        </Grid>
    </Grid>
</Window>
...
Рейтинг: 0 / 0
Запустить анимацию во время другой анимации
    #38870960
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slant-shadow,

не очень понял смысл фразы с того же места.

вот пример, в нём сперва кубик движется сверху вниз, затем при щелчке мышки на окно он меняет направление на слева на право:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<Window x:Class="AnimationExample.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"
        Loaded="MainWindow_OnLoaded">
    <Grid>
        <Canvas MouseUp="UIElement_OnMouseUp" Background="LightGray">
            <Border x:Name="Border" 
                    Canvas.Left="0" Canvas.Top="0" 
                    Width="10" Height="10" 
                    Background="LightBlue" BorderBrush="Blue" BorderThickness="1"/>
        </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.
using System;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media.Animation;

namespace AnimationExample
{
    public partial class MainWindow : Window
    {
        public MainWindow() { InitializeComponent(); }

        private Storyboard _storyboard1;
        private Storyboard _storyboard2;

        private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
        {
            _storyboard1 = new Storyboard();
            var animation = new DoubleAnimation
            {
                To = 200,
                Duration = TimeSpan.FromSeconds(3.0),
                RepeatBehavior = RepeatBehavior.Forever
            };
            Storyboard.SetTarget(animation, Border);
            Storyboard.SetTargetProperty(animation, new PropertyPath("(Canvas.Top)"));
            _storyboard1.Children.Add(animation);
            _storyboard1.Begin();
        }

        private void UIElement_OnMouseUp(object sender, MouseButtonEventArgs e)
        {
            _storyboard1.Pause();
            _storyboard2 = new Storyboard();
            _storyboard2.Completed += _storyboard1_Completed;
            var animation = new DoubleAnimation
            {
                To = 400,
                Duration = TimeSpan.FromSeconds(3.0),
            };
            Storyboard.SetTarget(animation, Border);
            Storyboard.SetTargetProperty(animation, new PropertyPath("(Canvas.Left)"));
            _storyboard2.Children.Add(animation);
            _storyboard2.Begin();
        }

        void _storyboard1_Completed(object sender, EventArgs e)
        {
            _storyboard1.Stop();
            _storyboard2.Stop();
        }
    }
}
...
Рейтинг: 0 / 0
Запустить анимацию во время другой анимации
    #38871515
Slant-shadow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как правильно запустить анимацию используя Storyboard?
Не срабатывает
Код: c#
1.
2.
3.
4.
5.
Storyboard sb = new Storyboard();
Storyboard.SetTarget(da, grid_green);
Storyboard.SetTargetProperty(da, new PropertyPath(TranslateTransform.XProperty));
sb.Children.Add(da);
sb.Begin();
...
Рейтинг: 0 / 0
Запустить анимацию во время другой анимации
    #38871541
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slant-shadow,

что пишет то? мы же не экстрасенсы :)
...
Рейтинг: 0 / 0
Запустить анимацию во время другой анимации
    #38871599
Slant-shadow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Анимация просто не происходит, ошибок нету
...
Рейтинг: 0 / 0
Запустить анимацию во время другой анимации
    #38872057
Slant-shadow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

А у вас нету такого же примера, только с использованием Grid вместо Canvas?
...
Рейтинг: 0 / 0
Запустить анимацию во время другой анимации
    #38872234
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы опишите подробно, что должно происходить. А то, не очень понятно, что вы хотите сделать.
Если вы хотите, чтобы при изменении значения Grid.Column или Grid.Row элемент плавно улетал в нужную ячейку, то средствами Grid такое сделать нельзя. Но есть и другие пути для этого :)
...
Рейтинг: 0 / 0
Запустить анимацию во время другой анимации
    #38872331
Slant-shadow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При нажатии на кнопку два грида перемещаются в одну сторону с помощью анимации. Нужно, чтобы во время анимации при нажатии на кнопку они остановились и начали перемещаться в обратную сторону с текущего места. Для их остановки планировал использовать метод Stop(), а для этого нужно запустить анимацию через Storyboard.
...
Рейтинг: 0 / 0
Запустить анимацию во время другой анимации
    #38872345
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slant-shadow,

чтоб двигать гриды по экрану их нужно разместить в canvas, так как только в Canvas есть абсолютное позиционирование. либо создать свою панель и наследовать её, а в ней уже делать анимацию.
...
Рейтинг: 0 / 0
Запустить анимацию во время другой анимации
    #38872428
Slant-shadow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Я вверху выложил пример, где два грида перемещаются с помощью анимации и расположены они тоже в гриде
...
Рейтинг: 0 / 0
Запустить анимацию во время другой анимации
    #38872440
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slant-shadow,

ну это ежели через трансформации, то можно где угодно и как угодно крутить :) тут вопросов нет :)
...
Рейтинг: 0 / 0
Запустить анимацию во время другой анимации
    #38872572
Slant-shadow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Код: c#
1.
2.
3.
4.
DoubleAnimation da = new DoubleAnimation();
da = new DoubleAnimation(0, -mwidth, timeAnimation); 
grid_green.RenderTransform = new TranslateTransform();
grid_green.RenderTransform.BeginAnimation(TranslateTransform.XProperty, da); 


Как можно запуск такой анимации изменить на запуск с помощью Storyboard?
Такой вариант не работает
Код: c#
1.
2.
3.
4.
5.
6.
DoubleAnimation da = new DoubleAnimation();
Storyboard sb = new Storyboard();
Storyboard.SetTarget(da, grid_green);
Storyboard.SetTargetProperty(da, new PropertyPath(TranslateTransform.XProperty));
sb.Children.Add(da);
sb.Begin();
...
Рейтинг: 0 / 0
Запустить анимацию во время другой анимации
    #38872587
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slant-shadow,

Код: xml
1.
2.
3.
4.
5.
        <Grid x:Name="Grid2" Width="100" Height="100" Background="LawnGreen">
            <Grid.RenderTransform>
                <TranslateTransform X="0.0" Y="0.0"/>
            </Grid.RenderTransform>
        </Grid>



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
            var storyboard2 = new Storyboard();
            var animation2 = new DoubleAnimation
            {
                From = -200,
                To = 200,
                Duration = TimeSpan.FromSeconds(3.0),
                RepeatBehavior = RepeatBehavior.Forever
            };
            Storyboard.SetTarget(animation2, Grid2);
            Storyboard.SetTargetProperty(animation2, new PropertyPath("RenderTransform.(TranslateTransform.X)"));
            storyboard2.Children.Add(animation2);
            storyboard2.Begin();
...
Рейтинг: 0 / 0
Запустить анимацию во время другой анимации
    #38872592
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

если используешь <TransformGroup> и несколько трансформаций, то тогда нужно еще указать
RenderTransform[ <индекс трансформации> ].(TranslateTransform.X)
...
Рейтинг: 0 / 0
Запустить анимацию во время другой анимации
    #38873762
Slant-shadow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Спасибо.
А можете еще подсказать, как сделать возможность нажимать на кнопку и выполнять действие бесконечное количество раз в одном обработчике?
У меня сейчас количество действий зависит от количества if.
Код: 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.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
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.Controls.Primitives;
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();
            da_green.Completed += OnComplitedAnimationGrid_green;
            da_darkviolet.Completed += OnComplitedAnimationGrid_darkviolet;
        }
        Storyboard sb = new Storyboard();
        Storyboard sbd = new Storyboard();
        DoubleAnimation da_green = new DoubleAnimation();
        DoubleAnimation da_darkviolet= new DoubleAnimation();
        public double mwidth { get { return main_grid.ActualWidth; } }
        public bool fl1 = true;
        public bool fl2 = false;
        public bool flg = true;
        public bool st;
        public bool stt;
        private Duration timeAnimation = new Duration(new TimeSpan(0, 0, 0, 6));

        private void OnComplitedAnimationGrid_green(object sender, EventArgs e)
        {

            grid_green.RenderTransform = new TranslateTransform(); 
            grid_darkviolet.Visibility = Visibility.Visible;
            fl2 = true;
            fl1 = false;
            st = false;
            stt = false;
        }

        private void OnComplitedAnimationGrid_darkviolet(object sender, EventArgs e)
        {
            grid_darkviolet.RenderTransform = new TranslateTransform();
            grid_darkviolet.Visibility = Visibility.Collapsed;
            fl1 = true;
            fl2 = false;
            st = false;
            stt = false;
        }

        private void MoveGrids(object sender, RoutedEventArgs e)
        {
   
            if (fl1)
            {
                if (!st)
                {
                    st = true;
                    da_darkviolet = new DoubleAnimation(mwidth, 0, timeAnimation); 
                    Storyboard.SetTarget(da_darkviolet, grid_darkviolet);
                    Storyboard.SetTargetProperty(da_darkviolet, new PropertyPath("RenderTransform.(TranslateTransform.X)"));
                    sb.Children.Add(da_darkviolet);
                    sb.Begin();
                    grid_darkviolet.Visibility = Visibility.Visible;

                    da_green = new DoubleAnimation(0, -mwidth, timeAnimation); 
                    da_green.Completed += OnComplitedAnimationGrid_green;

                    Storyboard.SetTarget(da_green, grid_green);
                    Storyboard.SetTargetProperty(da_green, new PropertyPath("RenderTransform.(TranslateTransform.X)"));
                    sb.Children.Add(da_green);
                    sb.Begin();
                }
                else
                {
                    st = false;
                   
                    sb.Pause();
                    da_green = new DoubleAnimation(0, timeAnimation);
                    da_darkviolet = new DoubleAnimation(mwidth, timeAnimation);

                    Storyboard.SetTarget(da_green, grid_green);
                    Storyboard.SetTargetProperty(da_green, new PropertyPath("RenderTransform.(TranslateTransform.X)"));
                    sbd.Children.Add(da_green);
                    sbd.Begin();

                    Storyboard.SetTarget(da_darkviolet, grid_darkviolet);
                    Storyboard.SetTargetProperty(da_darkviolet, new PropertyPath("RenderTransform.(TranslateTransform.X)"));
                    sbd.Children.Add(da_darkviolet);
                    sbd.Begin();
                }
            }

            if (fl2)
            {
                if (!stt)
                {
                    stt = true;
                    da_green = new DoubleAnimation(-mwidth, 0, timeAnimation);

                    Storyboard.SetTarget(da_green, grid_green);
                    Storyboard.SetTargetProperty(da_green, new PropertyPath("RenderTransform.(TranslateTransform.X)"));
                    sb.Children.Add(da_green);
                    sb.Begin();
                    grid_green.Visibility = Visibility.Visible;

                    da_darkviolet = new DoubleAnimation(0, mwidth, timeAnimation);
                    da_darkviolet.Completed += OnComplitedAnimationGrid_darkviolet;
                    Storyboard.SetTarget(da_darkviolet, grid_darkviolet);
                    Storyboard.SetTargetProperty(da_darkviolet, new PropertyPath("RenderTransform.(TranslateTransform.X)"));
                    sb.Children.Add(da_darkviolet);
                    sb.Begin();
                }
                else
                {
                    stt = false;
                    sb.Pause();
                    da_green = new DoubleAnimation(-mwidth, timeAnimation);
                    da_darkviolet = new DoubleAnimation(0, timeAnimation);

                    Storyboard.SetTarget(da_green, grid_green);
                    Storyboard.SetTargetProperty(da_green, new PropertyPath("RenderTransform.(TranslateTransform.X)"));
                    sbd.Children.Add(da_green);
                    sbd.Begin();

                    Storyboard.SetTarget(da_darkviolet, grid_darkviolet);
                    Storyboard.SetTargetProperty(da_darkviolet, new PropertyPath("RenderTransform.(TranslateTransform.X)"));
                    sbd.Children.Add(da_darkviolet);
                    sbd.Begin();
                }
            }
        }
    }
}           
...
Рейтинг: 0 / 0
Запустить анимацию во время другой анимации
    #38873763
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slant-shadow,

не очень понял, что должно быть. Нажимаешь на кнопку и Grid двигается, нажимаешь и останавливается, нажимаешь анимация продолжается или что?
...
Рейтинг: 0 / 0
Запустить анимацию во время другой анимации
    #38873769
Slant-shadow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Нажимаешь и два грида двигаются в одну сторону, нажимаешь еще раз, вызывается метод Pause() и гриды начинают двигаться в обратную сторону, нажимаешь третий раз опять меняют сторону и тд. Если один раз нажал, а второй не нажимать, то анимация не прервется и метод Pause() не будет вызываться, и анимация закончится по вызову события Completed. При следующем нажатии, анимация запускается и гриды движутся в обратную сторону.
...
Рейтинг: 0 / 0
Запустить анимацию во время другой анимации
    #38874040
Slant-shadow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без прерывания анимации можно было обойтись переменной bool и в зависимости от ее значения выбирается действие, в котором можно менять значение этой переменной на противоположное. А с возможностью неограниченного прерывания анимации?
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Запустить анимацию во время другой анимации
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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