使用Show()时表单设计搞砸了

时间:2013-03-27 13:47:57

标签: c# winforms show showdialog

我正在尝试制作加载屏幕窗口。我使用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()时:

image 1

使用Show()时:

image 2

1 个答案:

答案 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}}支持。