0

ウィンドウの読み込み中に進行状況バーを表示することに問題があります。実際には、データグリッドに多くのアイテムを含むウィンドウがあります。window.Show() を呼び出すと、開くまでに非常に長い時間がかかったので、次のような呼び出しが可能かどうか疑問に思っています。

 ShowProgressBar spb = new ShowProgressBar();
            spb.Topmost = true;
            spb.Owner = this.Owner;
            spb.Show();

            while(mainWin.isLoaded)
                  spb.updatePB(); // this method updating progressbar.value.
mainWindow.Show();

しかし、読み込み中はprogresbarrをまったく表示せず、ウィンドウが完全に読み込まれたときにのみ表示されます。

役立つコードはありますか? ;)

4

2 に答える 2

1

問題は、両方とも UI スレッド上にあるため、MainWindow の読み込みが完了するまでプログレス バーの UI を更新できないことです。解決策は、別のスレッドを使用して ProgressBar の UI を更新することです....

このようなものが動作するはずです:

 Dispatcher progressDisptacher;
 var uiThread = new Thread(() =>
  {
      ShowProgressBar spb = new ShowProgressBar();
      spb.Topmost = true;
      spb.Show();
      progressDisptacher = spb.Dispatcher;

      // allowing the main UI thread to proceed 
     System.Windows.Threading.Dispatcher.Run();
   });
   uiThread.SetApartmentState(ApartmentState.STA);
   uiThread.IsBackground = true;
   uiThread.Start();

   mainWindow.Show();
   progressDisptacher.BeginInvokeShutdown(DispatcherPriority.Send);

ご覧のとおり、mainWindow が読み込まれた後、以下を使用してプログレス バー スレッドを強制終了できます。 progressDisptacher.BeginInvokeShutdown(DispatcherPriority.Send);

于 2013-02-06T15:19:26.140 に答える
0

メインウィンドウがロードされていないときにプログレスバーを更新したいとします。したがって、最初にwhileループを反転する必要があります。

ただし、その単一の問題はもう少し微妙です。

STAスレッドの非常に苦痛な作業へようこそ。簡単な経験則では、画面に表示される内容に関係することはすべて、メインスレッドで行う必要があります。実際、メインスレッドを使用していない場合、.netはメインスレッドを使用して、変更されたもの(プログレスバーなど)を再描画します。

プログレスバーを表示できるようにするには、UIスレッドの制御をメッセージループと呼ばれるものに戻す必要があります。これを行う最も簡単な方法は、メソッド呼び出しを返すことです。ただし、その前に、定期的に進行状況を確認するタイマーを設定する必要があります。

現在のコードは、実際にmainWindowをロードするのではなく、mainWindowがロードされているかどうかを1日中チェックするだけです。

ただし、mainWindowの実際のロードでは、メインスレッドを使用して構築する必要があります。

すっごく...最後に、アイテムをデータグリッドにロードするバインディングをIsAsyncで出力する必要があります。

于 2013-02-06T15:26:25.417 に答える