Laden...

[gelöst] UpdateLayout vs DoEvents

Erstellt von martinO vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.794 Views
M
martinO Themenstarter:in
164 Beiträge seit 2009
vor 13 Jahren
[gelöst] UpdateLayout vs DoEvents

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?

  1. Möglichkeit: UpdateLayout.. erzwingt ein force repaint synchron
        private void TranslationsGrid_ColumnsPopulated(object sender, RoutedEventArgs e)
        {
            // force repaint
            this.UpdateLayout();

            this.DoSomething();
        }
  1. Möglichkeit: DoEvents (macht etwas mit dem Dispatcher - da fehlt mir das nötige Wissen, um das erklären zu können - aber hier tummeln sich ja einige Profis 😉)
        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

5.742 Beiträge seit 2007
vor 13 Jahren

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.

M
martinO Themenstarter:in
164 Beiträge seit 2009
vor 13 Jahren

Hallo winSharp93

Vielen Dank für die Antwort. Ich werd mir mal die Dispatcher-Geschichten reinziehen müssen.