Ich benutze die IProgressDialog
Schnittstelle wie normal, alles funktioniert in Ordnung, aber der Fortschrittsdialog erscheint nur nach ein paar Sekunden, wenn es entscheidet, dass der Vorgang tatsächlich lang ist. Obwohl dies nirgendwo dokumentiert ist, scheint es ein beabsichtigtes Verhalten zu sein und in vielen Fällen nicht schlecht. In dieser speziellen Anwendung müsste ich sie jedoch sofort anzeigen.IProgressDialog, um sofort zu starten
Ich fand eine single reference auf dem gesamten Wide Web, um dies zu erkennen und einen Workaround vorschlagen. Aber vielleicht, weil es während dieser 9 Jahre durchaus ein paar neue Windows-Versionen waren, scheint es heute nicht zur Arbeit:
IProgressDialog dialog;
dialog.StartProgressDialog(owner, null, flags, IntPtr.Zero);
...
IntPtr DialogHWnd;
((IOleWindow)dialog).GetWindow(out DialogHWnd);
SendMessage(DialogHWnd, WM_TIMER, new IntPtr(1), IntPtr.Zero);
Der Fenstergriff ist OK, überprüfte ich es, kein Fehler vorhanden ist, einfach da ist keine Veränderung im Verhalten. Der Dialog erscheint erst nach einigen Sekunden.
Hat jemand einen Vorschlag, den gleichen Dialog und die gleiche Funktionalität in C# erneut zu erstellen? Natürlich nicht unmöglich, aber der Stockdialog hat neben den Usern auch nette Features wie Animation und Abbruchverhalten.
Die Idee ist sehr schön (ich tatsächlich versucht 'Timer()', aber nicht mit dem Wiederaufnahme-Flag). Aber es ist noch nicht perfekt, fürchte ich. Es funktioniert in diesem einfachen Beispiel von dir, aber in der realen Anwendung, wo ich auch den Fortschrittsbalken handhaben muss, bekomme ich entweder sofort den * oder * richtigen Fortschrittsbalken später. :-) Ich versuche es weiter und melde mich wieder. Vielen Dank. –
OK, habe es gefunden. Der wichtige Punkt war, dass dies kein einfacher Fortschrittsbalken war. Der Fortschrittsdialog animiert den Balken im Hintergrund zwischen den Aufrufen von 'SetProgress()', damit er sich zwischen den angegebenen Werten glatter bewegt, anstatt zu springen. Daher musste ich zusätzlich zu Ihrer Idee jeden 'SetProgress()' -Aufruf wie folgt umschließen: 'dialog.Timer (PDTIMER_PAUSE, null); dialog.SetProgress (...); dialog.Timer (PDTIMER_RESUME, null); ' –