【发布时间】:2017-08-01 12:01:39
【问题描述】:
我正在创建一个带有图片框的 WinForms 应用程序,这些图片框默认情况下被禁用且不可见。当我单击表单中的单选按钮时,我希望出现图片框,然后立即在它们上绘制一些东西:
// 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 的特殊行为?我什至尝试了正常的调用,令我惊讶的是,它并没有导致死锁。这是为什么呢?
[编辑] 这是一个说明问题的最小示例:
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 我添加了一个例子。
-
我添加了一个答案:D
标签: c# winforms picturebox synchronizationcontext