0

我想实现这一点:

  1. 创建一个新窗口,它只是一个旋转加载器和一些静态文本,并显示它。
  2. 在 UI 线程上做一些计算(必须在那里完成)
  3. 关闭加载程序窗口

目前,当我在加载程序窗口上调用 .Show() 时,它根本不加载,它只是作为一个空白窗口挂出(UI 线程被阻塞,我不想要)

我可以做些什么来使加载程序窗口在我的计算完成的同时显示其内容?

private void CopyToClipboard(object sender, RoutedEventArgs e)
    {
        var selected = mDataGrid.SelectedItem;
        var selectedIndex = mDataGrid.SelectedIndex;
        var progressWindow = mProgressDialog.Create(this,"Copying data to clipboard");
        progressWindow.Show();
        try
        {

            mDataGrid.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
            mDataGrid.SelectionMode = DataGridSelectionMode.Extended;
            mDataGrid.SelectAllCells();  // SLOW !!!!
            ApplicationCommands.Copy.Execute(null, mDataGrid); //SLOW !!!!
        }
        catch (Exception ex)
        {
            mLog.Error("Copying to clipboard", ex);
            MessageBox.Show("Error while copying to clipboard");
        }
        finally
        {
            mDataGrid.SelectionMode = DataGridSelectionMode.Single;
            mDataGrid.UnselectAllCells();
            this.Select(selectedIndex, selected);
            progressWindow.Close();
        }
    }
4

2 回答 2

1

正如您所说,您的计算是在 UI 线程上完成的,这就是为什么您的窗口是空白的,由于 UI 线程很忙,它没有“重新绘制”。

因此,除非您在另一个线程上进行长时间运行的计算,否则您将陷入困境。

于 2012-07-16T12:29:34.110 回答
0

我唯一能做到的是:

progressWindow.Show();
this.DoEvents();


public static void DoEvents(this Window _)
    {
        Application.Current.Dispatcher.Invoke(DispatcherPriority.Background,
                                              new Action(delegate { }));
    }

“加载器窗口”至少会显示出来,因此用户知道正在发生一些事情。它通常持续不到一秒钟,所以这个解决方案对我来说是可以接受的。

于 2012-07-17T08:29:30.427 回答