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;
}));
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.
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.
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
Es soll nun automatisiert (mittels Button Click) möglich sein diese grafischen Elemente in den "Container" einzufügen
Zeig mal!
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(....));
}
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!"
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?
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.
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).