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

「ローダーウィンドウ」は少なくとも表示されるので、ユーザーは何かが起こっていることを知っています。それは通常1秒未満続くので、この解決策は私には受け入れられます。

于 2012-07-17T08:29:30.427 に答える