私はデフォルトでは無効になっていて表示されていない画像ボックスでWinFormsアプリケーションを作成しています。私は、フォームのラジオボタンをクリックすると、私は、画像ボックスを表示すると、その直後に、私は何かが彼らの上に描画することにしたい。C#で何が起こるかPictureBox.VisibleがTrueに設定されている場合
// the radio button CheckedChanged event handler:
table1PictureBox.Enabled = true;
table1PictureBox.Visible = true;
DrawCorrectAnswers(); // draw something over the picture box
問題は絵が行われる前に描画が終了するということです見えるので、図は最終的に画像で覆われます。
私はhereを読んで、Visibilityをtrueに設定した後、実際のイメージの読み込みがフォームのメッセージキューに入れられていることを確認しました。その答えは、タイマーを設定して、そのティックを非同期的に待ってから描画を行うことで、画像の読み込みに時間がかかる可能性があるということを示唆しています。私はタイマーを設定して解決策が気に入らず、代わりに写真そのものが読み込まれるのを待っています。
これを行う方法はありますか?この場合、Visibleをtrueに設定することはどのくらい正確に機能しますか?
また、私はこのように見えた別の解決策を考え出すことを試みた:
// the radio button CheckedChanged event handler:
table1PictureBox.Enabled = true;
table1PictureBox.Visible = true;
this.BeginInvoke(new Action(() => { DrawCorrectAnswers(); })); // 'this' is the form
私の考えでは、これがロードするためのメッセージの後に描画するためのメッセージ、そうでも操作をキューというものでした必要な順序で実行されます。しかし、これはうまくいきませんでした。
この場合、フォームのスレッドにある場合、BeginInvokeの特別な動作があるかもしれませんか?私は通常のInvokeを試してみましたが、驚いたことに、デッドロックは発生しませんでした。何故ですか?
[EDIT】ここで、問題を示して最小限の例です:
public Form1()
{
InitializeComponent();
pictureBox1.Visible = false;
pictureBox1.Enabled = false;
}
private void button1_Click(object sender, EventArgs e)
{
pictureBox1.Enabled = true;
pictureBox1.Visible = true;
Graphics graphics = pictureBox1.CreateGraphics();
graphics.DrawLine(Pens.Black, 0, 0, 50, 50);
}
DrawCorrectAnswers関数のコードを追加して、あなたの問題はイメージの読み込みではなく、画像の再描画と思われます。 – Gusman
@Gusman例を追加しました。 – honzukka
そして私は答えを追加しました:D – Gusman