Kiedyś potrzebna mi była taka funkcjonalność w moim programie, ja to zrobiłem za pomocą jednej metody:
delegate void FadeCompletedCallback();
void Fade(int interval, double step, double destOpacity, FadeCompletedCallback fadeCompleted)
{
System.Threading.Timer timer = null;
AsyncOperation aoAsync = AsyncOperationManager.CreateOperation(null);
timer = new System.Threading.Timer(delegate
{
if (Opacity < destOpacity)
{
aoAsync.Post(delegate
{
Opacity += (Opacity + step) > destOpacity ? destOpacity - Opacity : step;
}, null);
}
else if (Opacity > destOpacity)
{
aoAsync.Post(delegate
{
Opacity -= (Opacity - step) < destOpacity ? Opacity - destOpacity : step;
}, null);
}
else if (Opacity == destOpacity)
{
timer.Dispose();
if (fadeCompleted != null)
{
aoAsync.Post(delegate
{
fadeCompleted();
}, null);
}
}
}, null, 0, interval);
}
Część przerobiłem teraz "z ręki", w razie jakby coś nie działało to pisz.