2012-10-25 17 views
6

Ich entwerfe eine GUI und ich habe eine Bezeichnung, die ich effektiv als eine "Bitte warten" Nachricht verwenden, nachdem ich eine Aktion aufrufen, die eine Weile dauert. Der Text des Labels ist statisch. Ich habe ihn in den Eigenschaften in VS2010 für das Label-Steuerelement festgelegt.C# WinForms Etikett wird angezeigt, aber nicht Text angezeigt

Wenn ich diese Aktion auf dem Formular, ich .Show() das Steuerelement, das normalerweise ausgeblendet wird, bis der zeitaufwendige Prozess abgeschlossen ist, dann .Hide() es. Wenn es die .Show() trifft, erscheint das Label (ich weiß das, weil ich den BorderStyle auf Fixed3D gesetzt habe, so dass ich den Rand des Labels sehen kann), aber es ist kein Text drin. Ich habe versucht, das Etikett auf Autosize zu setzen und nicht vergebens, mein Text ist auf Schwarz auf Grau gesetzt, also keine unsichtbare Tinte, alles ist sichtbar, Schrift ist gesetzt. Der Code wird so ausgeführt, wie ich es möchte, es gibt einfach keinen Text auf dem Etikett. Ich bin ratlos.

Irgendwelche Ideen?

Antwort

10

Wenn der zeitaufwändige Prozess im selben Thread auftritt, könnte es sich um ein Aktualisierungs-/Neuausgabe-Problem handeln (wobei der Prozessor zu beschäftigt ist, um UI-Anforderungen zu verarbeiten). Versuchen Sie entweder, das Fenster zu aktualisieren, bevor Sie den langwierigen Prozess starten, oder den zeitaufwändigen Prozess in einen BackgroundWorker zu verschieben.

+0

Es tritt in demselben Thread auf, aber der Showaufruf wird ausgeführt, bevor der Prozess gestartet wird, und der Verbergungsaufruf erfolgt nach einem .waitforExit() für den Prozess. Beide Aufrufe werden ausgeführt und das Label wird angezeigt und verschwindet wie erwartet, es fehlt nur der Text –

+0

Dies erwies sich als die richtige Antwort, Aufruf .refresh() auf dem Etikett nach .show() behoben. Seltsam, denke, es brauchte nur den zusätzlichen Kick in den Hintern, um fertig zu zeichnen und seine Eigenschaften richtig anzuwenden, bevor ich mit dem Prozess begann. Vielen Dank! –

3

Vielleicht vermisse ich etwas, aber warum stellst du nicht einfach label.Visible?

+2

.show() und .hide() sind gleichbedeutend mit .visible = true und .visible = false. Also, der gleiche Effekt. Label wird angezeigt, aber kein Text –

6

Wenn der zeitaufwändige Prozess nicht in einem Hintergrundthread ausgeführt wird, wird Ihre Benutzeroberfläche nicht aktualisiert, da keine Nachrichtenverarbeitung stattfindet. Die Steuerelemente zeichnen sich in WM_Paint-Nachrichten neu.

Versuchen Sie, Refresh auf dem Steuerelement oder auf seinem Fenster-Handle-Eltern (das Formular) aufzurufen, nachdem Sie seinen Status geändert haben, bevor Sie in den langen Prozess eintauchen.

Oder verschieben Sie den lang andauernden Prozess in einen Hintergrund-Thread (siehe .NET 4.0-Task), um den UI-Thread freizugeben.

+0

Das war die richtige Antwort, aber ich gab Cyborg den grünen Scheck, da er eine Minute schneller antwortete. Danke für die Hilfe, trotzdem upvoted –

Verwandte Themen