рдореИрдВрдиреЗ рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдореЗрдВ рдереЛрдбрд╝рд╛ рддрд░рд╛рд╢рд╛ рдФрд░ рдЙрд╕ рдкрд░ рдХреБрдЫ рдардВрдбрд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдпрд╣ рд╢рд╛рдВрдд, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдЪрд┐рдХреЛрдЯреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡реЗрдмрдбрд╛рдиреЛрд▓ рд╣реИ рдпрд╛ рдХрд╣рд╛рдВ рд╣реИ? :)ред рдФрд░ рдпрд╣рд╛рдВ рдореБрдЭреЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, WPF / рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдореЗрдВ рдПрдиреАрдореЗрд╢рди рд╕рд┐рд╕реНрдЯрдоред MSDN рд╕реНрдореЛрдХреНрдб рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЙрддреНрд╕рд╛рд╣ рд╕реЗ XAML рдореЗрдВ рдПрдирд┐рдореЗрд╢рди рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдореИрдВрдиреЗ рдПрдХ, рджреВрд╕рд░рд╛, рддреАрд╕рд░рд╛ рд▓рд┐рдЦрд╛ ... рдФрд░ рдлрд┐рд░ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд░рдо рдореЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдФрд░ рдлрд┐рд░ рдореБрдЭреЗ рдорд╣рд╕реВрд╕ рд╣реБрдЖ рдХрд┐ XAML, рд╕рдВрдХреНрд░рдордг рдмрд╣реБрдд рдмреЗрдорд╛рдиреА рд╣реИред рдпрд╣ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓ рд╣реИ: рдЖрдк рддреБрд░рдВрдд рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рджреГрд╢реНрдп рд╕рдВрдкрд╛рджрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдереЛрдбрд╝рд╛ рдХрдо рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк рдЗрд╕ XAML рдореЗрдВ рдХреБрдЫ рддрд░реНрдХ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреА рд╕рд╛рд░реА рдЧреИрд░рдмрд░рд╛рдмрд░реА рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд▓рдЧрддреА рд╣реИред Google рдХреЛ рдзреВрдореНрд░рдкрд╛рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ
рд╕рдм рдХреБрдЫ XAML рдореЗрдВ рдЪрдордХрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╡реЗ рд╢рдкрде рд▓реЗрддреЗ рд╣реИрдВ, рдХреЛрдб рдореЗрдВ рднреНрд░рдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рд░реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд▓рд┐рдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдЬреИрд╕реЗ рдХреИрдХреНрдЯрд╕, рдЪреЗрд╕реНрд▓реЛрд╡реЛ рд╡рд╛рд▓реЗ рдЪреВрд╣реЗред рдФрд░ рдлрд┐рд░ рдореБрдЭреЗ рдирд┐рдпрдорд┐рдд рд╕реА # рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдирд┐рдореЗрд╢рди рдХрд╛ рд╕рдЯреАрдХ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдорд┐рд▓рд╛ред рд╣рдо, рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдУрд▓реНрдбрдлреИрдЧ, рд╡рд┐рдирдПрдкреАрдЖрдИ рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдПрдирд┐рдореЗрд╢рди рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдбрд░рд╛рддреЗ рд╣реИрдВ? :)
рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкреЛрд░реНрдЯреЗрдмрд▓ рд╡рд░реНрдЧ
рдПрдиреАрдореЗрд╢рдирдмрд╛рдЧ рд╣реИ ред рдпрд╣ рдкреЛрд░реНрдЯреЗрдмрд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ WPF рдФрд░ рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рджреЛрдиреЛрдВ рдореЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмрджрд▓рд╛рд╡ рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
public class AnimationItem { public event EventHandler Completed; private void OnStoryboardComplete(object sender, EventArgs e) { if (Completed != null) Completed(this, EventArgs.Empty); } private Storyboard storyboard; public Storyboard Storyboard { get { return storyboard; } set { if (storyboard != null) storyboard.Completed -= OnStoryboardComplete; storyboard = value; storyboard.Completed += OnStoryboardComplete; } } public Action BeginAction { get; set; } public Action EndAction { get; set; } } public class AnimationBag { private readonly Dictionary<string, AnimationItem> storyboards = new Dictionary<string, AnimationItem>(); public void AddAnimation(string name, DependencyObject control, string propertyName, Timeline animation, Action beginAction = null, Action endAction = null) { Storyboard board = new Storyboard(); AnimationItem item = new AnimationItem { BeginAction = beginAction, EndAction = endAction }; Storyboard.SetTarget(animation, control); Storyboard.SetTargetProperty(animation, new PropertyPath(propertyName)); board.Children.Add(animation); if (endAction != null) item.Completed += item_Completed; item.Storyboard = board; storyboards[name] = item; } private void item_Completed(object sender, EventArgs e) { KeyValuePair<string, AnimationItem> pair = storyboards.Where(x => x.Value.Equals(sender)).FirstOrDefault(); if (pair.Value != null && pair.Value.EndAction != null) pair.Value.EndAction.Invoke(); } public void StartAnimation(string name) { if (!storyboards.ContainsKey(name)) return; if (storyboards[name].BeginAction != null) storyboards[name].BeginAction.Invoke(); storyboards[name].Storyboard.Begin(); } public void StopAnimation(string name) { if (!storyboards.ContainsKey(name)) return; storyboards[name].Storyboard.Stop(); if (storyboards[name].EndAction != null) storyboards[name].EndAction.Invoke(); } public static DoubleAnimation CreateDoubleAnimation(double? to, long durationMs, double? from = null, bool repeat = false) { DoubleAnimation ret = new DoubleAnimation { To = to, From = from, Duration = new Duration(TimeSpan.FromMilliseconds(durationMs)) }; if (repeat) ret.RepeatBehavior = RepeatBehavior.Forever; return ret; } }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрдХреНрд╖рд╛ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред
XAML:
<Window x:Class="Animation.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> <Rectangle Height="110" HorizontalAlignment="Left" Margin="55,71,0,0" Name="rectangle1" Stroke="Black" VerticalAlignment="Top" Width="181" Fill="#FF9D3434" /> <Button Content="Button" Height="36" HorizontalAlignment="Left" Margin="286,93,0,0" Name="button1" VerticalAlignment="Top" Width="149" Click="button1_Click" /> </Grid> </Window>
рдХреЛрдб-рдкреАрдЫреЗ:
public partial class MainWindow : Window { private readonly AnimationBag animations = new AnimationBag(); public MainWindow() { InitializeComponent(); InitAnimations(); } private void InitAnimations() { animations.AddAnimation( "fadeOut", rectangle1, "Opacity", AnimationBag.CreateDoubleAnimation(0, 500), null, () => animations.StartAnimation("fadeIn")); animations.AddAnimation( "fadeIn", rectangle1, "Opacity", AnimationBag.CreateDoubleAnimation(1, 500)); } private void button1_Click(object sender, RoutedEventArgs e) { animations.StartAnimation("fadeOut"); } }
рдХрдХреНрд╖рд╛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╢рдмреНрджрдХреЛрд╢ рд╣реИ - рдПрдиреАрдореЗрд╢рди рдирд╛рдо рдФрд░ рдореВрд▓реНрдп - рдПрдирд┐рдореЗрд╢рдиред
InitAnimations рдкрджреНрдзрддрд┐ рдореЗрдВ, рдирд╛рдо рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рджреЛ рдПрдирд┐рдореЗрд╢рди рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕ рдирд┐рдпрдВрддреНрд░рдг рдХреА рд╕рдВрдкрддреНрддрд┐ рдФрд░ рдПрдиреАрдореЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд╣реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЬрд╛рдПрдЧреАред рдЖрдк рдЗрд╕реЗ рдкреЗрди рд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк
DoubleAnimation рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реНрдереИрддрд┐рдХ рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛,
AddAnimation рдкрджреНрдзрддрд┐ рджреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреА рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдПрдиреАрдореЗрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рдПрдиреАрдореЗрд╢рди рдХреЗ рдмрд╛рдж "fadeOut" рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, "fadeIn" рддреБрд░рдВрдд рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдПрдХ рдмрд▓реНрдХрд┐ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрдВрддреНрд░ рдорд┐рд▓рд╛ рдЬреЛ рд╣рдореЗрдВ рдУрд╡рд░рд▓реЛрдб рдПрдХреНрд╕рдПрдПрдордПрд▓ рдХреЗ рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдХреЗ рдмрдЬрд╛рдп рдХреЛрдб рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдирд┐рдореЗрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕реНрд░реЛрдд рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ