我正在研究C#/ .NET 3.5/Windows Forms程序。我想创建一个无模式对话框,然后使用主窗体生成的信息对其进行更新。我发现了其他方向的几个例子 - 来自对话框的信息更新了主窗口,但我遇到了相反的麻烦。对话框中的图形用户界面无法正常工作。鼠标光标是沙漏。我有时会看到更新,但我经常看到一个坚实的白色盒子,其他窗口的残余物曾经在对话框的顶部,或者它冻结。使用Windows窗体从主窗口更新无模式对话框
最终,对话框将显示更复杂的信息,但现在我只是想重复出现的主窗口标签的计数器。要启动对话,我做到以下几点:
bool secondWindowOpen = false;
Thread secondWindowThread;
MyPopupWindow secondWindow;
delegate void TextBoxDelegate(string message);
private void buttonPop_Click(object sender, EventArgs e)
{
// If the second window is not open, then open it
if (!secondWindowOpen)
{
secondWindowOpen = true;
secondWindow = new MyPopupWindow();
secondWindowThread = new Thread(secondWindow.MyMethod);
secondWindowThread.Start();
}
else // Close the second window
{
secondWindowOpen = false;
secondWindow.ShouldStop = true;
secondWindowThread.Join();
}
}
我更新与下面的代码计数器:
if (secondWindow != null)
{
secondWindow.CounterText = args.FrameNumber.ToString();
}
控制模式对话框的代码如下所示。我承认设置文本字段的代码可能是错误的,但这是我现在正在处理的最好的事情(调用调用给我带来麻烦)。
public partial class MyPopupWindow : Form
{
public MyPopupWindow()
{
InitializeComponent();
}
public bool ShouldStop
{
get { return shouldStop; }
set { shouldStop = value; }
}
private bool shouldStop = false;
public void MyMethod()
{
this.Show();
this.Refresh();
while (!shouldStop)
{
Thread.Sleep(100);
labelCounter.Text = CounterText;
Refresh();
}
this.Close();
}
public string CounterText;
}
我的大问题如下:什么是放无模式对话框进入第二个线程,它只是需要更新自己的GUI元素的最佳方法是什么?从主窗口/线程更新这些GUI元素的最佳方法是什么?谢谢!
感谢。我并不熟悉Windows Forms在封面上的工作方式,因此您的解释有所帮助。最初我开始按照你的建议来做,但是当我失败时,我最终陷入了你看到的多线程混乱中。现在它正在工作。我会发布一个我当前代码的例子。 – GrandAdmiral 2012-07-20 19:31:43