AnimationHelpers.cs
95 lines
| 3.0 KiB
| text/x-csharp
|
CSharpLexer
/ Implab.Fx / AnimationHelpers.cs
cin
|
r4 | using System; | ||
using System.Collections.Generic; | ||||
using System.Linq; | ||||
using System.Text; | ||||
using System.Windows.Forms; | ||||
using System.Diagnostics; | ||||
namespace Implab.Fx | ||||
{ | ||||
public static class AnimationHelpers | ||||
{ | ||||
cin
|
r5 | public static Animation<TTarget> AnimateProperty<TTarget, TVal>(this Animation<TTarget> animation, Action<TTarget, TVal> setter, Func<TTarget, TVal> getter, TVal newValue, Func<TVal, TVal, int, int, TVal> fx) where TTarget : class | ||
cin
|
r4 | { | ||
if (animation == null) | ||||
throw new ArgumentNullException("animation"); | ||||
TVal oldValue = getter(animation.Traget); | ||||
animation.Step += (target, elaped, duration) => | ||||
{ | ||||
var value = fx(oldValue, newValue, elaped, duration); | ||||
setter(target, value); | ||||
}; | ||||
return animation; | ||||
} | ||||
cin
|
r5 | public static Animation<T> AnimateTransparency<T>(this T ctl, float newValue) where T : Form | ||
cin
|
r4 | { | ||
cin
|
r5 | var anim = new Animation<T>(ctl); | ||
cin
|
r4 | |||
anim.AnimateProperty( | ||||
(target, value) => target.Opacity = value, | ||||
target => target.Opacity, | ||||
newValue, | ||||
(ov, nv, el, du) => ov + ((float)el / du) * (nv - ov) | ||||
); | ||||
return anim; | ||||
} | ||||
cin
|
r5 | |||
cin
|
r30 | public static IPromise<T> CloseFadeOut<T>(this T ctl) where T : Form | ||
cin
|
r5 | { | ||
var anim = ctl.AnimateTransparency(0); | ||||
cin
|
r106 | return anim | ||
.Play() | ||||
.DispatchToControl(ctl) | ||||
.Then(frm => { | ||||
frm.Close(); | ||||
return frm; | ||||
}); | ||||
cin
|
r5 | } | ||
cin
|
r30 | public static IPromise<T> OverlayFadeIn<T>(this Form that, T overlay) where T : Form | ||
cin
|
r5 | { | ||
if (that == null) | ||||
throw new ArgumentNullException("that"); | ||||
if (overlay == null) | ||||
throw new ArgumentNullException("overlay"); | ||||
// setup overlay | ||||
overlay.Opacity = 0; | ||||
overlay.FormBorderStyle = FormBorderStyle.None; | ||||
overlay.ShowInTaskbar = false; | ||||
that.AddOwnedForm(overlay); | ||||
EventHandler handler = (object sender, EventArgs args) => | ||||
{ | ||||
overlay.Bounds = that.RectangleToScreen(that.ClientRectangle); | ||||
}; | ||||
// attach handlers | ||||
that.Move += handler; | ||||
that.Resize += handler; | ||||
that.Shown += handler; | ||||
// remove handlers to release overlay | ||||
overlay.FormClosed += (sender, args) => | ||||
{ | ||||
that.Move -= handler; | ||||
that.Resize -= handler; | ||||
that.Shown -= handler; | ||||
}; | ||||
overlay.Show(that); | ||||
overlay.Bounds = that.RectangleToScreen(that.ClientRectangle); | ||||
return overlay | ||||
.AnimateTransparency(1) | ||||
.Play() | ||||
.DispatchToControl(overlay); | ||||
} | ||||
cin
|
r4 | } | ||
} | ||||