我正在尝试制作加载屏幕窗口。我使用Show()
而不是ShowDialog()
,因为我有一些代码在显示后执行。使用ShowDialog()
表单时很好,但使用Show()
表格时搞砸了。是什么造成了这个问题,解决方案是什么?我是这样做的:
bool closeLoadingWindow = false;
void ShowLoadingWindow()
{
LoadingWindow loadingWindow = new LoadingWindow();
loadingWindow.Show();
while (!closeLoadingWindow);
loadingWindow.Close();
return;
}
public MainWindow()
{
Thread loadingWindowThread = new Thread(ShowLoadingWindow);
loadingWindowThread.Start();
InitializeComponent();
// ...
closeLoadingWindow = true;
}
使用ShowDialog()
时:
使用Show()时:
答案 0 :(得分:2)
ShowDialog
正在工作的原因是因为你的while
循环不会执行,一旦运行时遇到该代码行,它将停止处理,直到表单被消化。
您的代码没有意义,这里使用线程的关键是将“忙”代码(您的while
循环)保留在主UI线程之外,这样它就不会阻塞。但是,您尝试在相同的线程上创建/显示表单,并在此处创建非UI线程。
你不一定需要在这里使用Show
,你可以使用ShowDialog
但是在减少表格等方面有点棘手。但是,要解决你遇到的问题我建议你做的那一刻:
LoadingWindow _loadingWindow;
void ShowLoadingWindow()
{
if (_loadingWindow == null)
_loadingWindow = new LoadingWindow();
_loadingWindow.Show();
}
void HideLoadingWindow()
{
if (_loadingWindow != null)
{
_loadingWindow.Close();
_loadingWindow.Dispose();
}
}
void LoadSomething()
{
while (...)
{
// busy code goes here
}
// after code is finished, close the form
MethodInvoker closeForm = delegate { HideLoadingWindow(); };
_loadingWindow.Invoke(closeForm);
}
public MainWindow()
{
ShowLoadingWindow();
new Thread(LoadSomething).Start();
}
}
仅供参考 - 根据您在线程中尝试做什么的性质,使用Task Parallel Library而不是创建专用线程可能是更好的方法,可以使用continuation / {等各种好处{3}}支持。