2011-05-21 123 views
0

为什么图片框控件的可见性属性在这里不起作用。我最初将它们设置为false,以便在屏幕加载时它们不可见。但是,我希望切换这个。我做了以下,但似乎没有工作。这是一个Windows窗体应用程序。切换图片框的可见性C#

private void Action() 
    { 
     while (true) 
     { 

      Random r1 = new Random(); 
      int num = r1.Next(1,3); 

      switch (num) 
      { 
       case 1: 
        pictureBoxLeft.Visible = true; 
        pictureBoxRight.Visible = true; 
        break; 
       case 2: 
        pictureBoxLeft.Visible = true; 
        pictureBoxRight.Visible = false; 
        break; 
       case 3: 
        pictureBoxLeft.Visible = false; 
        pictureBoxRight.Visible = true; 
        break; 

      } 

      Thread.Sleep(200); 
      pictureBoxLeft.Visible = false; 
      pictureBoxRight.Visible = false; 
      Thread.Sleep(500); 
     } 
    } 

此外,要正确使用文本框!有任何想法吗???

非常感谢提前

+0

这是你的代码背后的文件? – 2011-05-21 20:59:07

+0

是的。这是我的代码背后的文件 – Nishant 2011-05-21 21:01:06

回答

1

这是你的UI线程。 UI线程非常繁忙,以至于没有时间刷新显示。 UI线程忙于无尽的循环,所以它如何更新UI?

+0

那么它为什么与文本框一起工作? – Nishant 2011-05-21 21:02:36

+0

在这种情况下,即使文本框也不会启用。你能在文本框中编辑文本吗? – 2011-05-21 21:11:21

+0

是的。如果我用文本框替换图片框,则可见性会切换。我只需要在这里切换可见性。任何想法如何解决这个问题? – Nishant 2011-05-21 21:16:40

5

Visible属性设置为true不会显示控件,它只会创建一条消息显示它。只要您保持主线程忙于Sleep,它不会处理任何消息,并且控件将不会显示。

您应该显示图片框,然后设置一个带有代码的计时器,这些代码会在计时器的滴答事件触发时隐藏图片框。然后退出您的方法,以便主线程可以处理将显示图片框的消息。

0

除了Thread.Sleep();呼叫Application.DoEvents()触发事件处理/ UI更新。但是确保你不会再次拨打Action()。一个简单的Thread.Sleep()将不允许UI更新,因为您仍处于处理程序中,并且该框架将无法自行触发任何新事件,因为它不会知道您是否在等待时完成(由于线程仍然很忙)。

总体而言,您的方法可能是一个坏主意(取决于其他代码等)。考虑使用计时器或后台工作者。

0

每当用户界面发生变化并没有发生变化后,你总是做一些修改,Refres()。例如pictureBoxLeft.Refresh();。这将始终使UI更改显示。请让我知道它是否适合你。