Laden...

Dispatcher.BeginInvoke / Probleme beim Aktualisieren des GUIs

Erstellt von Philb vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.098 Views
P
Philb Themenstarter:in
44 Beiträge seit 2009
vor 13 Jahren
Dispatcher.BeginInvoke / Probleme beim Aktualisieren des GUIs

Hallo zusammen

Ich habe eine Sliverlight Applikation mit GUI das u.a. ein Canvas enthält als "Container". In diesen Container lassen sich grafische Objekte hinein ziehen. Es soll nun automatisiert (mittels Button Click) möglich sein diese grafischen Elemente in den "Container" einzufügen, das man immer die Zwischenschritte sieht (jede Sekunde ein Element).

Leider kriege das mit dem Dispatcher nicht hin. Was mache ich falsch ?


this.Canvas.Dispatcher.BeginInvoke(new Action(() =>
{
    this.LayoutRoot.Invalidate;
}));
6.862 Beiträge seit 2003
vor 13 Jahren

Hallo,

was willst du mit dem Dispatcher? Nimm doch nen Timer in dem du einfach das Element dem Canvas hinzufügst.

Und pass bitte den Threadtitel an. Da gehört ne kurze Beschreibung des Problems hin, nicht einfach der Name eines Funktionsaufrufs.

Baka wa shinanakya naoranai.

Mein XING Profil.

P
Philb Themenstarter:in
44 Beiträge seit 2009
vor 13 Jahren

Ich möchte das mein GUI automatisch aktualisiert wird, damit der User die "Zwischenschritte" sieht. Das funktioniert momentan nicht. Ich habe einige Beispeile gefunden, die das Problem mittels Dispatcher lösen (könnten). Bei mir funktioniert's aber nicht.

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo Philb,

wie schon Talla gesagt hat ist es in solchen Fällen am einfachsten wenn man einfach den DispatcherTimer verwendet und in einem Intervall von 1 Sek dein Teil hinzufügt.

Da brauchst du dann auch nicht den Dispatcher zu verwenden da alles im selben Thread läuft 😃

Gruss
Michael

U
1.688 Beiträge seit 2007
vor 13 Jahren

Es soll nun automatisiert (mittels Button Click) möglich sein diese grafischen Elemente in den "Container" einzufügen

Zeig mal!

P
Philb Themenstarter:in
44 Beiträge seit 2009
vor 13 Jahren

Ich hab's mal mit dem DispatcherTimer versucht, leider geht's nicht.

Hier mal mein Code:

Das spezielle ... das GUI soll während eines Aufrufs einer rekursiven Funktion "neu gezeichnet" werden.

<UserControl x:Class="xyz"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">

  <Canvas>
        <Canvas x:Name="LayoutRoot" Height="800" Width="480">
        </Canvas>
        <Button Click="....">
  </Canvas>
</UserControl>

  private void btnInfo_Click(object sender, EventArgs e)
        {
            MakeIt(1,2,3);
        }

        public void MakeIt(int calc1, int calc2, int calc3)
        {
             if (........)
                MakeIt(x,y,z);
                // warte 1 Sekunde
                AddNewItems();
                //REFRESH GUI
        }

        public void AddNewItems()
        {
                this.LayoutRoot.Children.Add(new Image(....));
        }

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

kannst du nicht alle Elemente hinzufügen und Sichtbarkeit auf unsichtbar setzten. Der Button-Click startet den Timer und der blendet ein Element nach dem anderen ein.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

U
1.688 Beiträge seit 2007
vor 13 Jahren

Ich hab's mal mit dem DispatcherTimer versucht, leider geht's nicht

Wie versucht, was geht nicht?

  
        public void MakeIt(int calc1, int calc2, int calc3)  
        {  
             if (........)  
                MakeIt(x,y,z);  
                // warte 1 Sekunde  
                AddNewItems();  
                //REFRESH GUI  
        }  
  

Warten im GUI-Thread ist schlecht:
s. [FAQ] Warum blockiert mein GUI?

P
Philb Themenstarter:in
44 Beiträge seit 2009
vor 13 Jahren

Ich hab's mal mit dem DispatcherTimer versucht, leider geht's nicht

Wie versucht, was geht nicht?

Die "Zwischenstände" werden mir nicht angezeigt, nur der Endzustand am Schluss wenn die rekursive Funktion "durch" ist.

U
1.688 Beiträge seit 2007
vor 13 Jahren

Die "Zwischenstände" werden mir nicht angezeigt, nur der Endzustand am Schluss wenn die rekursive Funktion "durch" ist.

Wie schon oben gesagt - eine "rekursive" Funktion im GUI, die noch dazu regelmäßig wartet, ist nicht geeignet. Dabei ist es egal, ob sie über einen Button oder einen Timer aufgerufen wird.
Gemeint war ja auch eher, bei jedem Aufruf des Timers ein Element zu erzeugen (und eben nicht alle).