-
-
Save nathan-fiscaletti/3c0514862fe88b5664b10444e1098778 to your computer and use it in GitHub Desktop.
using System; | |
using System.Threading.Tasks; | |
using System.Windows.Forms; | |
namespace FormFader | |
{ | |
/// <summary> | |
/// An object used to control fading forms in and out. | |
/// </summary> | |
class Fader | |
{ | |
// This delegate is later used as a call back for | |
// when the form has completed fading. | |
public delegate void FadeCompleted(); | |
// Class properties | |
private readonly Form form; // The form to modify the opacity of. | |
private readonly Form parentForm; // The parent form if being displayed as a dialog. | |
private FadeDirection fadeDirection; // The direction in which to fade. | |
private float fadeSpeed; // The speed at which to fade. | |
private FadeCompleted fadeFinished; // The delegate to call when a fade has completed. | |
private bool shouldClose; // If set to true, the form will close after fading out. | |
private readonly TaskCompletionSource<DialogResult> showDialogResult // The Async Task Completion Source for displaying as a dialog. | |
= new TaskCompletionSource<DialogResult>(); | |
// Enum for controlling the fade direction. | |
private enum FadeDirection | |
{ | |
In, | |
Out | |
} | |
// Constants for setting the fade speed. | |
// (You can alternately use a custom float value) | |
public static class FadeSpeed | |
{ | |
public static readonly float Slowest = 1; | |
public static readonly float Slower = 10; | |
public static readonly float Slow = 25; | |
public static readonly float Normal = 50; | |
public static readonly float Fast = 60; | |
public static readonly float Faster = 75; | |
public static readonly float Fastest = 100; | |
} | |
/// <summary> | |
/// Construct the Fader object with a form. | |
/// </summary> | |
private Fader(Form form) | |
{ | |
this.form = form; | |
} | |
/// <summary> | |
/// Construct a Fader object with a form and a parent form. | |
/// </summary> | |
private Fader(Form form, Form parent) : this(form) | |
{ | |
this.parentForm = parent; | |
} | |
/// <summary> | |
/// Begin fading the form. | |
/// </summary> | |
private void BeginFade() | |
{ | |
UpdateOpacity(); | |
fadeFinished?.Invoke(); | |
} | |
/// <summary> | |
/// Update the opacity of the form using the timer. | |
/// </summary> | |
private async void UpdateOpacity() | |
{ | |
if (form.IsDisposed) | |
{ | |
return; | |
} | |
switch (fadeDirection) | |
{ | |
// Fade in | |
case FadeDirection.In: | |
if (form.Opacity < 1.0) | |
form.Opacity += (fadeSpeed / 1000.0); | |
else | |
return; | |
break; | |
// Fade out | |
case FadeDirection.Out: | |
if (form.Opacity > 0.1) | |
{ | |
form.Opacity -= (fadeSpeed / 1000.0); | |
} | |
else | |
{ | |
if (!shouldClose) | |
form.Hide(); | |
else | |
form.Close(); | |
return; | |
} | |
break; | |
} | |
await Task.Delay(10); | |
UpdateOpacity(); | |
} | |
/// <summary> | |
/// Fade the form in at the defined speed as a dialog | |
/// based on parent form. | |
/// </summary> | |
private async Task<DialogResult> ShowDialog(float fadeSpeed, FadeCompleted finished) | |
{ | |
parentForm.BeginInvoke(new Action(() => showDialogResult.SetResult(form.ShowDialog(parentForm)))); | |
fadeFinished = finished; | |
form.Opacity = 0; | |
this.fadeSpeed = fadeSpeed; | |
fadeDirection = FadeDirection.In; | |
BeginFade(); | |
return await showDialogResult.Task; | |
} | |
/// <summary> | |
/// Fade the form in at the defined speed. | |
/// </summary> | |
private void FadeIn(float fadeSpeed, FadeCompleted finished) | |
{ | |
form.Opacity = 0; | |
form.Show(); | |
fadeFinished = finished; | |
this.fadeSpeed = fadeSpeed; | |
fadeDirection = FadeDirection.In; | |
BeginFade(); | |
} | |
/// <summary> | |
/// Fade the form out at the defined speed. | |
/// </summary> | |
private void FadeOut(float fadeSpeed, FadeCompleted finished) | |
{ | |
if (form.Opacity < 0.1) | |
{ | |
finished?.Invoke(); | |
return; | |
} | |
fadeFinished = finished; | |
form.Opacity = 100; | |
this.fadeSpeed = fadeSpeed; | |
fadeDirection = FadeDirection.Out; | |
BeginFade(); | |
} | |
/// <summary> | |
/// Fades a dialog in using parent form and defined fade speed. | |
/// </summary> | |
public async static Task<DialogResult> ShowDialog(Form form, Form parent, float fadeSpeed) | |
{ | |
Fader fader = new Fader(form, parent); | |
return await fader.ShowDialog(fadeSpeed, null); | |
} | |
/// <summary> | |
/// Fades a dialog in using parent form and defined fade speed | |
/// and call the finished delegate.) | |
/// </summary> | |
public async static Task<DialogResult> ShowDialog(Form form, Form parent, float fadeSpeed, FadeCompleted finished) | |
{ | |
Fader fader = new Fader(form, parent); | |
return await fader.ShowDialog(fadeSpeed, finished); | |
} | |
/// <summary> | |
/// Fade a form in at the defined speed. | |
/// </summary> | |
public static void FadeIn(Form form, float fadeSpeed, FadeCompleted finished) | |
{ | |
Fader fader = new Fader(form); | |
fader.FadeIn(fadeSpeed, finished); | |
} | |
/// <summary> | |
/// Fade a form out at the defined speed. | |
/// </summary> | |
public static void FadeOut(Form form, float fadeSpeed, FadeCompleted finished) | |
{ | |
Fader fader = new Fader(form); | |
fader.FadeOut(fadeSpeed, finished); | |
} | |
/// <summary> | |
/// Fade a form in at the defined speed. | |
/// </summary> | |
public static void FadeIn(Form form, float fadeSpeed) | |
{ | |
Fader fader = new Fader(form); | |
fader.FadeIn(fadeSpeed, null); | |
} | |
/// <summary> | |
/// Fade a form out at the defined speed. | |
/// </summary> | |
public static void FadeOut(Form form, float fadeSpeed) | |
{ | |
Fader fader = new Fader(form); | |
fader.FadeOut(fadeSpeed, null); | |
} | |
/// <summary> | |
/// Fade a form out at the defined speed and | |
/// close it when the fade has completed. | |
/// </summary> | |
public static void FadeOutAndClose(Form form, float fadeSpeed) | |
{ | |
Fader fader = new Fader(form) | |
{ | |
shouldClose = true | |
}; | |
fader.FadeOut(fadeSpeed, null); | |
} | |
/// <summary> | |
/// Fade a form out at the defined speed and | |
/// close it when the fade has completed. | |
/// After the form has closed, call the FadeComplete delegate. | |
/// </summary> | |
public static void FadeOutAndClose(Form form, float fadeSpeed, FadeCompleted finished) | |
{ | |
Fader fader = new Fader(form) | |
{ | |
shouldClose = true | |
}; | |
fader.FadeOut(fadeSpeed, finished); | |
} | |
} | |
} |
Hello and thanks for the library. I have tried to show a ShowDialog with the effect, but I can not do it. This is my code:
private void btnFinal_Click(object sender, EventArgs e) { var frm = new DlgNumeration(); frm.Visible = false; Fader.ShowDialog(frm, this, Fader.FadeSpeed.Slower); }
Try removing
frm.Visible = false;
and see if that works.
Hi, I've done that but it does not work, it shows the form but without the effect.
Hello and thanks for the library. I have tried to show a ShowDialog with the effect, but I can not do it. This is my code:
private void btnFinal_Click(object sender, EventArgs e) { var frm = new DlgNumeration(); frm.Visible = false; Fader.ShowDialog(frm, this, Fader.FadeSpeed.Slower); }
Try removing
frm.Visible = false;
and see if that works.Hi, I've done that but it does not work, it shows the form but without the effect.
Check the latest update, i believe it fixes this issue!
Thanks for this.
Thank you for this code, Nate. I used it the other day to solve a little challenge I had. It worked like a champ! https://github.com/rogerpence/toast-notifications-for-windows
Thank you for this code, Nate. I used it the other day to solve a little challenge I had. It worked like a champ! https://github.com/rogerpence/toast-notifications-for-windows
Glad it helped! Feel free to give the snippet a star if you're feeling so inclined :)
Try removing
frm.Visible = false;
and see if that works.