Laden...

ProgressBar Marquee Effekt - Aktuallisieren??

Erstellt von Sebastian1989101 vor 13 Jahren Letzter Beitrag vor 13 Jahren 10.631 Views
Sebastian1989101 Themenstarter:in
241 Beiträge seit 2010
vor 13 Jahren
ProgressBar Marquee Effekt - Aktuallisieren??

Hallo Community,

eine Frage zu ProgressBars unter WPF:
Im Designer sehe ich zwar schon das er mir einen Marquee effekt anzeigt, allerdings wenn ich diese ProgressBar den verwenden moechte ist davon nichts mehr zu sehen. Ich verwende fuer die Anwendung in moment das MVVM-Pattern und wollte halt fuer Ueberpruefungen die eine unbestimmte Zeit dauern eine ProgressBar mit Marquee Effekt einblenden. Das Ein- und Ausblenden Klappt auch soweit ganz gut nur zeigt er mir nichts an, nichtmal wie im Designer die Marquee Animation. 😦

Weiss jemand wie es geht? Aktuell hab ich die ProgressBar wie folgt Implementiert:

<ProgressBar Grid.Row="0" Margin="5,5,5,0" IsIndeterminate="True" />

WAGO Kontakttechnik GmbH & Co. KG / Software Notion
Softwareentwicklung

C# .NET with WPF, ASP, Xamarin and Unity
Personal Blog: Development Blog

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo Sebastian1989101,

was ist konkret deine Frage? An _IsIndeterminate _kannst du binden. Dazu stellst du im ViewModel einfach eine Property bereit. _Value _kannst du auch jederzeit ändern. Verstecken kannst du das Control auch so gut.

Der Designer von WPF ist nicht wirklich der beste. Er hat immer so ein paar Probleme. Es kann gut sein, dass dir der Designer was falsches anzeigt. Das kannst du getrost ignorieren. Du kannst versuchen den XAML neuzuladen.

zero_x

Sebastian1989101 Themenstarter:in
241 Beiträge seit 2010
vor 13 Jahren

Die Frage war lediglich wie ich den Marquee Effekt ausserhalb vom Designer bei einer WPF ProgressBar erzielen kann. Den dies geht in moment so nicht.

WAGO Kontakttechnik GmbH & Co. KG / Software Notion
Softwareentwicklung

C# .NET with WPF, ASP, Xamarin and Unity
Personal Blog: Development Blog

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo Sebastian1989101,

dein Code für die Progressbar ist so schon richtig.
Wenn du _**:::

Das muss auch so sein wenn du das Programm laufen lässt.
Versuche das mal an einem kleinen Testprojekt wo du nichts als was eine Progressbar mit Marquee hast. Dann siehst du dass es funktioniert 😃

Kann es sein dass du bei deinem Projekt irgend eine langlaufende Operation hast die die GUI blockiert? Siehe: [FAQ] Warum blockiert mein GUI?
Das ist zwar etwas weit hergeholt aber das könne mitunter ein Grund für dieses Problem sein.

Denn wenn du die GUI blockierst dann kann es schon passieren dass er dir den Effekt nicht anzeigt.

Gruß
Michael

P
660 Beiträge seit 2008
vor 13 Jahren

Hi,

vielleicht ist das BusyIndicator-Control etwas für dich

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

Sebastian1989101 Themenstarter:in
241 Beiträge seit 2010
vor 13 Jahren

Natuerlich laeuft grade ein GUI Blockierender Prozess sonst wuerde ich die ProgressBar ja nicht brauchen. Muss man diese den auch Asynchron aufrufen wenn man nur ein Marquee Effekt will? Und wenn ja wie ruft man ganze fenster asnyc auf weil die progressbar in ein eigenem window waere.

WAGO Kontakttechnik GmbH & Co. KG / Software Notion
Softwareentwicklung

C# .NET with WPF, ASP, Xamarin and Unity
Personal Blog: Development Blog

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo,

wenn du mit deiner Aufgabe den GUI-Thread total blockierst dann kann dieser auch nicht mehr den Marquee Effekt anzeigen.
Und wenn der User noch ein bisschen rumklickt dann kommt das schön "Anwendung reagiert nicht mehr"

Du musst die Aufgaben in einen Thread / Backgroundworker auslagern.
Wie das funktioniert und was man beachten muss ist in [FAQ] Warum blockiert mein GUI? genau beschreiben

Gruß
Michael

Sebastian1989101 Themenstarter:in
241 Beiträge seit 2010
vor 13 Jahren

Ist es den ueberhaupt moeglich das anzeigen von Views in einen anderen Thread zu packen? oder gibts ne moeglichkeit das die Methode erst zurueck geht wenn der thread beendet ist so eine Art WaitingFor? Oder brauch ich irekt nen ganz neuen loesungs ansatz??

WAGO Kontakttechnik GmbH & Co. KG / Software Notion
Softwareentwicklung

C# .NET with WPF, ASP, Xamarin and Unity
Personal Blog: Development Blog

6.862 Beiträge seit 2003
vor 13 Jahren

Hallo,

im genannten FAQ Beitrag sind doch Lösungen benannt. Nicht die GUI gehört in nen anderen Thread, sondern immer die blockierende Aktion. Und wenn du den BackgroundWorker benutzt bekommst du ja nen komfortables Gerüst was Benachrichtigungen zum Fortschritt der Aktion angeht.

Baka wa shinanakya naoranai.

Mein XING Profil.

Sebastian1989101 Themenstarter:in
241 Beiträge seit 2010
vor 13 Jahren

Mag sein das die Aktion in nen anderen ghoert... aber wenn du meinst alles gelesen haettest wuesstest du das ich den was brauche wie ein WaitingFor sonst Funktioniert das nicht.. die nachkommenden Aktionen bauen auf dem Result auf. Wenns keins gibt waere das verhalten anders als wenns eins gibt. Wie der BackgroundWorker Funktioniert weiss ich, aber dessen Funktionen genuegen nicht wenn ich nichts uebersehen habe.

WAGO Kontakttechnik GmbH & Co. KG / Software Notion
Softwareentwicklung

C# .NET with WPF, ASP, Xamarin and Unity
Personal Blog: Development Blog

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo,

das kannst du auch mit dem Background-Worker oder einem Thread machen.
Wenn der beendet wird dann überprüfst du das Result und kannst dann bei Bedarf einen neunen starten oder den bereits bestehenden eine neue Aufgabe geben.

In .NET 4 wurde die Task Parallel Library hinzugefügt, damit könntest du es auch machen.
Aber ein Backgroundworker oder Thread langt da auch

Gruß
Michael

Sebastian1989101 Themenstarter:in
241 Beiträge seit 2010
vor 13 Jahren

Das ich es den auswerten koennte weiss ich ja... aber es muss nunmal die ganze anwendung warten und der zeitraum ist undefiniert wie lange. Darum kann ich nicht einfach die methode durch Asychronen Thread verlassen weil genau das geschiet beim backgroundWorker.

Ich brauch etwas wie er ohne Blockierung der GUI Wartet an der stelle oder halt die moeglichkeit ein fenster im anderen Thread fuer den Zeitraum X anzuzeigen.

Das hier ist zurzeit der Teil des Codes auf dem gewartet wird (oben die progressBar.. das Anzeigenn klappt ja soweit nur das Animieren hat nicht)


                if(_pageProvide != null)
                {
                    loadProgressbarModel = LoadProgressbarModel.GetInstance(_pageProvide, Resources.CheckUpdates_Check_ProgressBar_Reason);
                    loadProgressbarModel.Display();
                }

                HttpWebResponse webResponse = (HttpWebResponse)httpRequest.GetResponse();
                StreamReader responseStream = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF7);
                Version = responseStream.ReadLine();
                WebVersion = Convert.ToInt64(Version.Split(new[] { '.' }).Aggregate("", (current, s) => current + string.Format("{0:D5}", Convert.ToInt32(s))));

                Notes = responseStream.ReadToEnd();
                responseStream.Close();

Die Methode verlassen darf er halt erst wenn der responseStream auch wirklich Closed ist - nicht zuvor weil wie gesagt ne menge da dran hengt...

WAGO Kontakttechnik GmbH & Co. KG / Software Notion
Softwareentwicklung

C# .NET with WPF, ASP, Xamarin and Unity
Personal Blog: Development Blog

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo,

dann kannst du ja beim Starten den Threads eine Progressbar anzeigen (und vielleicht noch die ganze GUI ausgrauen).
Über das ReportProgress vom Backgroundworker kannst du dir dann die Progressbar updaten und den Status anzeigen.

Wenn der Thread fertig ist dann kannst du die Progressbar wieder ausblenden.

Ob du das jetzt über ein Panel machst was du über die GUI legst oder ob du da ein Modales Fenster anzeigst ist deine Entscheidung....

Gruß
Michael

Sebastian1989101 Themenstarter:in
241 Beiträge seit 2010
vor 13 Jahren

Genu das is doch der Punkt 🤔

So wie du es grade schreibst wuerde ich die progressBar erst im anderen thread erzeugen -> aber wie soll sowas gehen? Bei mir sagt er immer kein Zugriff.

Der rest das er den was tut soll ja gar nicht im anderen Thred weil er darauf warten muss, es sei den es gibt eine moeglickeit ohne GUI Blockierung zu warten.

WAGO Kontakttechnik GmbH & Co. KG / Software Notion
Softwareentwicklung

C# .NET with WPF, ASP, Xamarin and Unity
Personal Blog: Development Blog

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo,

nein, du darfst ein GUI Objekt nie in einem anderen Thread erstellen.

Wenn du deine Operation startest und somit den Backgroundworker erstellst.
Dann must du im GUI - Thread die Progressbar anzeigen.
Dann startest du den Backgroundworker welcher im Hintergrund die Aufgabe erledigt und über diverse Events den Status an die GUI mitteilt.

Wenn der Bgw seine Aufgabe erledigt hat, dann kannst du im GUI Thread wieder die Progressbar ausblenden.

Bitte guck dir den Link an [FAQ] Warum blockiert mein GUI? da ist es genau beschrieben.
Den GUI Thread darf man niemals blockieren.

Gruß
Michael

Sebastian1989101 Themenstarter:in
241 Beiträge seit 2010
vor 13 Jahren

Oh man... ich fuehl mich grad als wuerde ich mit ner Wand reden -.-

Wenn kein anderer Thread Views anzeigen darf, den brauche ich halt eine Art WaitingFor fuer den Async Thread... ich kann nunmal nicht einfach weiter machen... Und genau das passiert. Er ruft die Methode auf Class.Methode -> startet dort Async den Thread der ausliest -> kehrt direkt zurueck und der aufrufer denkt alles ok weil die eigentliche antwort erst viel spaeter kommt... das Funktioniert so nunmal nicht...

btw. wie man etwas Asynchron aufruft weiss ich schon du brauchst nicht noch 10 mal das FAQ posten ich bin nicht blind. Was ich brauchse ist entweder A: eine moeglichkeit die progressBar im anderen Thread zu generieren udn anzuzeigen oder B: eine moeglichkeit ohne GUI Blockierung auf den Asycn Thread zu warten...

WAGO Kontakttechnik GmbH & Co. KG / Software Notion
Softwareentwicklung

C# .NET with WPF, ASP, Xamarin and Unity
Personal Blog: Development Blog

6.862 Beiträge seit 2003
vor 13 Jahren

Hallo,

weder A noch B gehen und sind sinnvoll. Die Lösung wurde dir doch schon genannt von michlG. Du zeigst die Progressbar an, startest die Aktion und wenn durch durch den BackgroundWorker die Benachrichtigung bekommst das die Aktion fertig ist, blendest die Progressbar wieder aus.

GUIs sind in .Net eventbasiert. Man wartet nie, sondern bekommt bei Bedarf die Events auf die man reagieren kann, und genau so musst du auch hier arbeiten.

Baka wa shinanakya naoranai.

Mein XING Profil.

F
10.010 Beiträge seit 2004
vor 13 Jahren

Es ist eher so das du nicht gegen eine Wand redest, sondern gegen das Brett vor dem Kopf ( sorry ) .

Deine Blockierende Funktion ist die gesammte zusammenhängende Aktion, nicht nur die eine Funktion.
Also gehört das ganze in den Thread/BGW

Du solltest dir dringend den mehrfach verlinkten Thread nochmal durchlesen, es steht wirklich alles da drin, incl. der Möglichkeit auf das beenden der Aktion zu reagieren, nicht zu warten.