我正在开发 C#/.NET 3.5/Windows 窗体程序。我想创建一个无模式对话框,然后使用从主窗体生成的信息对其进行更新。我发现了其他方向的几个示例 - 对话框中的信息更新了主窗口,但我在反向移动时遇到了麻烦。对话框中的 GUI 无法正常工作。鼠标光标是一个沙漏。我有时会看到更新,但我经常看到一个纯白框、曾经位于对话框顶部的其他窗口的残留物,或者它冻结了。
最终对话框将显示更复杂的信息,但现在我只是试图复制一个显示为主窗口标签的计数器。要启动对话框,我执行以下操作:
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 元素的最佳方法是什么?谢谢!