我正在创建一个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