Mam pewną formatkę, w której dzieje się długi proces. Na czas, gdy się dzieje, chciałabym zasłonić wszystkie kontrolki animowanym kółeczkiem.
Kółeczko włożyłam w PictureBox, które ma Dock = Fill. Długi proces dzieje się natomiast w BackgroundWorkerze.
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
ShowLoader();
_results = LongProcess();
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
LoadResultsToListView();
HideLoader();
}
Pokazywanie i chowanie jest zrobione w następujący sposób:
private void ShowLoader()
{
SetLoaderVisibility(true);
}
private void HideLoader()
{
SetLoaderVisibility(false);
}
private void SetLoaderVisibility(bool value)
{
loaderImage.InvokeIfRequired(x => x.Visible = value);
otherControl.InvokeIfRequired(x => x.Visible = !value);
}
I sam extension:
public static class ControlExtensions
{
public static void InvokeIfRequired<T>(this T control, Action<T> action) where T : ISynchronizeInvoke
{
if (control.InvokeRequired)
{
control.Invoke(new Action(() => action(control)), null);
}
else
{
action(control);
}
}
}
Ok, kod pokazany, to teraz do sedna. Kółeczko się kręci, ale brzydko, bo skokowo. Wygląda mi z resztą na to, że póki wykonuje się makro po stronie Worda (odpalane w LongProcess()), to kółeczko skacze, a jak przechodzi do odpytywania po HTTP (drugi etap LongProcess()), to zaczyna się kręcić ładnie i płynnie...
Czy macie jakieś podpowiedzi, co można zrobić, by kółeczko było ładne od początku? Czy pozostaje mi tylko przeklinać Worda?