我正在研究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