1

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

图 1

使用 Show() 时:

图 2

4

1 回答 1

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();
}
}

仅供参考 - 根据您在线程中尝试执行的操作的性质,使用任务并行库而不是创建专用线程可能是一种更好的方法,具有各种好处,如继续/取消支持。

于 2013-03-27T14:03:28.960 回答