2012-10-25 36 views
6

GUIを設計しています。しばらく時間がかかる傾向にあるアクションを呼び出した後、メッセージを「しばらくお待ちください」というラベルを効果的に使用しています。ラベルのテキストは静的なので、VS2010のラベルコントロールのプロパティに設定しました。C#WinFormsラベルが表示されますが、テキストは表示されません。

私はフォーム上でそのアクションを打つと、時間がかかるプロセスが完了するまで普通は隠されていたコントロールを.Show()し、.Hide()します。 .Show()にヒットすると、ラベルがポップアップします(BorderStyleがFixed3Dに設定されているので、ラベルの境界線が表示されるので、これを知っています)が、テキストはまったくありません。私はラベルを自動サイズに設定しようとしましたが、無駄ではありません。私のテキストはグレーで黒に設定されているので、目に見えないインクはありません。コードを実行したいときは、ラベルにはテキストが表示されません。私は迷っている。

アイデア?

答えて

10

時間がかかるプロセスが同じスレッドで発生している場合は、リフレッシュ/再描画の問題(プロセッサがUI要求を処理するにはビジー状態)が原因である可能性があります。長時間実行しているプロセスを開始する前にウィンドウをリフレッシュするか、時間のかかるプロセスをBackgroundWorkerに入れてください。

+0

同じスレッドで発生しますが、プロセスの開始前にshow呼び出しが実行されています。プロセスの.waitforExit()の後にhide呼び出しがあります。両方の呼び出しが実行されていて、ラベルが表示され、期待どおりに消えていて、テキストが欠落しています。 –

+0

.shared()の後にラベルの.refresh()を呼び出すと正しい答えが返されました。奇妙なことに、私はプロセスを開始する前に、描画自体を終了し、そのプロパティを正しく適用するために、バットで余分なキックが必要になったと思います。ありがとう! –

3

多分私は何かを逃しているが、なぜあなたはlabel.Visibleを設定しないのですか?

+2

.show()および.hide()は、.visible = trueおよび.visible = falseと同じです。だから、同じ効果。ラベルは表示されますが、テキストはありません –

6

時間のかかるプロセスがバックグラウンドスレッドで実行されていない場合、メッセージ処理が行われていないためUIが更新されません。コントロールはWM_Paintメッセージで再描画されます。

長いプロセスに入る前に、状態を変更した後、コントロールまたはそのウィンドウハンドル親(フォーム)でRefreshを呼び出してみてください。

または、長期実行プロセスをバックグラウンドスレッド(.NET 4.0タスク参照)に移動して、UIスレッドを解放します。

+0

これは正解でしたが、Cyborgに緑色の小切手を渡しました。しかし、助けてくれてありがとう、まだupvoted –

関連する問題