Hallo zusammen
ich hab für eine Aufgabe 2 Lösungen gefunden. Irgendwie gefällt mir die DoEvents Lösung besser, aber da muss ich selbst noch was hinzuimplementieren und die andere Lösung wäre UpdateLayout zu verwenden, welches bereits durch .net zur Verfügung gestellt wird.
Problem: Ich muss zwingend abwarten, bis ein Grid vollständig gezeichnet und gefüllt ist. Dazu abonniere ich den Event "ColumnsPopulated" welcher geschmissen wird, wenn das Grid (devexpress component) gezeichnet wurde. Leider dauert das Abfüllen der Werte noch ein paar hunderstel Sekunden länger. Wie warte ich nun ab, bis alle Werte drin sind?
private void TranslationsGrid_ColumnsPopulated(object sender, RoutedEventArgs e)
{
// force repaint
this.UpdateLayout();
this.DoSomething();
}
private void TranslationsGrid_ColumnsPopulated(object sender, RoutedEventArgs e)
{
DoEvents();
this.DoSomething();
}
public static void DoEvents()
{
if (Application.Current != null)
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { }));
}
Wo liegen für euch die Vorteile der einen, bzw. anderen Lösung?
Gruss
Martin
PS: Beide Lösungen funktionieren
Hallo martinO,
das mit dem DoEvents ist so eine Sache und sollte lieber vermieden werden (siehe: [FAQ] Warum blockiert mein GUI? ).
Schreibe das ganze lieber ein wenig um:
private void TranslationsGrid_ColumnsPopulated(object sender, RoutedEventArgs e)
{
Dispatcher.Current.BeginInvoke(new Action(this.DoSomething), DispatcherPriority.ApplicationIdle);
}
Erklärung: Die priorität gibt an, wann der Delegat ausgeführt werden soll. Da ApplicationIdle niedriger als z.B. Render ist, sollte sie erst ausgeführt werden, nachdem alles gezeichnet ist.
Hallo winSharp93
Vielen Dank für die Antwort. Ich werd mir mal die Dispatcher-Geschichten reinziehen müssen.