我正在創建一個WinForms應用程序,圖片框被禁用,默認情況下不可見。當我在窗體中單擊單選按鈕,我想要的圖片框出現,之後,我想繪製了他們的東西:當PictureBox.Visible設置爲True時,C#中究竟發生了什麼?
// the radio button CheckedChanged event handler:
table1PictureBox.Enabled = true;
table1PictureBox.Visible = true;
DrawCorrectAnswers(); // draw something over the picture box
的問題是,由畫面之前繪製完成可見,所以繪圖最終由圖片覆蓋。
在解決問題時,我讀取here,將Visibility設置爲true後,實際圖像加載在表單的消息隊列中排隊。答案甚至表明,一種可能的解決方案是設置一個計時器,然後異步等待其刻度,然後進行繪圖,以便圖片有時間加載。我不喜歡解決方案設置一個計時器,而是我想等待圖片本身加載。
有沒有辦法做到這一點?在這種情況下,設置如何顯示真正的工作?
我也試圖拿出看起來像這樣的一個替代解決方案:
// the radio button CheckedChanged event handler:
table1PictureBox.Enabled = true;
table1PictureBox.Visible = true;
this.BeginInvoke(new Action(() => { DrawCorrectAnswers(); })); // 'this' is the form
我的想法是,這將排隊的消息加載消息後拉伸,所以即使是操作將按照要求的順序執行。但是,這也不起作用。
在這種情況下,如果我處於窗體的線程中,可能會出現BeginInvoke的特殊行爲嗎?我甚至嘗試了正常的Invoke,令我驚訝的是,它並沒有造成僵局。這是爲什麼?
[編輯]這裏是一個說明該問題的小例子:
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