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
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
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
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
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
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"
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
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
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
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.
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
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
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
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
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
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
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
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.
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.