none
Wie kann ich die Applikation zwingen, ein Element, oder die Seite neu zu zeichnen? RRS feed

  • Frage

  • Ich habe um eine animierte Änderung in einem Textfeld darzustellen, den Inhalt in einer Schleife geändert und dann am Ende der Schleife jeweils den neuen Text dem Textfeld zugewiesen und dann, damit man auch etwas "flackern" sieht, eine Thread.Sleep(10); eingebaut.

    Leider sieht man jetzt nichts davon, es sieht aus, als wenn eine Schleife abläuft, die so lange wartet, bis alle Durchläufe abgeschlossen sind und dann wird gleich das Endergebnis dargestellt.

    Wie kann ich jetzt die Applikation dazu zwingen, das immer erst zu ändern und dann die 10 Millisekunden zu warten, damit man eine Animation sieht? Wenn es nicht geht nur, das eine Element neu zu zeichnen, dann eventuell die ganze Seite?

    Ich nutze Expression Blend 4 und bin kein wirklicher Entwickler, daher die Antworten bitte verständlich, dass ich sie auch umsetzen kann, danke.

    Ich hatte was mit Refresh(); und UpdateText(); gefunden, aber das funktioniert nicht, beim Rebuild sagt EB4 immer, dass das unbekannt ist.

    Freitag, 22. Oktober 2010 14:36

Alle Antworten

  • Gibt es denn gar keine Möglichkeit? Wie macht man das sonst?
    Mittwoch, 27. Oktober 2010 18:43
  • Hallo PC-Welt,

    wenn du im Haupthread (UI-Thread) einen Sleep einbaust dann wird die UI nicht neu gezeichnet die wartet ja dann.
    Um das zu umgehen kannst du einen BackgroundWorker - Thread verwenden. In dem Thread (DoWork) kannst du dann warten, der Hauptthread läuft derweil weiter... und das Textfeld wird automatisch neu gezeichnet, wenn die UI mal Zeit hat, das du ja mit dem Sleep steuern kannst.


    Regards,

    Dominik A. Ernst
    www.dominik-ernst.de, www.wp7-software.net
    Donnerstag, 28. Oktober 2010 11:27
  • Servus,

    der BackgroundWorker ist keine schlechte Idee, man kann aber auch einen ganz normalen Thread benutzen.

    @PPC-Welt

    achte aber dann auch darauf, dass Du per Dispatcher.Invoke(...) die "Daten" an den UI-Thread weiterreichen musst, um Änderungen beim/im UI zu verändern und sehen. Steck in das Invoke einfach eine Action<T> als delegate, der im UI-thread etwas mit deiner Textbox machen soll. 

    Da Du aber kein Entwickler bist, sind unsere Hinweise vermutlich Kauderwelsch für Dich. Evtl. ist das was du vor hast aber auch einfach mit einem Storyboard "innerhalb" von Blend möglich. Schau dir mal diesen Link --> http://msdn.microsoft.com/de-de/library/cc295300.aspx  an, vielleicht kommst Du damit auch schon weiter!

    Donnerstag, 28. Oktober 2010 11:58
  • Jetzt mal eine Lösung eines Designers ;-) 

    Du kannst auch ein Warten per Storyboard einbauen. z.B.:

     public class MyControl : Control
        {
            Storyboard Pause = new Storyboard();

            public MyControl()
            {
                this.Loaded += new RoutedEventHandler(MyControl_Loaded);        
            }

            void MyControl_Loaded(object sender, RoutedEventArgs e)
            {
                Pause.Duration = new Duration(TimeSpan.FromMilliseconds(MilisecondsToClose));
                Pause.Completed += new EventHandler(Pause_Completed);
            }

            void MethodCallingPause()
            {
                Pause.Begin();
            }

            void Pause_Completed(object sender, EventArgs e)
            {
                // code when storyboard has finished...
            }

    ...

    Mittwoch, 10. November 2010 21:42