2

待機画面をシミュレートするために、テキストブロックとプログレスバーの2つの要素のみを含む単純なChildWindowがあります。そのChildWindowは、非同期WCFメソッドを呼び出す前に開始され、コールバックで閉じられます。

問題は、ChildWindowが2回目に閉じられたときに、サーフェス全体が無効のままになることです。私は似たような状況を探しました。あるブログ投稿では、Closeメソッドが2回呼び出されると説明されていましたが、私の場合はそうではありません。

次にいくつかのサンプルコードを示します(svcはWCFサービスです)。

// global private class variable
private WaitingScreen wait = new WaitingScreen();

public void DoSomething()
{
  svc.SaveCompleted += (s, arg) =>
  {
    wait.Close();
  };

  wait.Show();
  svc.SaveAsync();
}

どんなポインタでもありがたいです、私はここで基本的な何かが欠けていると思います。

4

2 に答える 2

1

Close メソッドが 2 回呼び出されていますが、それは私の場合ではありません。

多分そうだと思います。DoSomethingに割り当てられたデリゲートの数と削除されたデリゲートの数を 2 回呼び出したとSaveCompletedします。回答: 2 つが追加され、削除されたものはありません。したがって、2 回目に完了すると、2 回Close続けて呼び出されます。

一度起動された後にデリゲートを削除するこのコードを試してください。

public void DoSomething()
{
  var wait = new WaitingScreen();

  EventHandler<AsyncCompletedEventArgs> saveCompleted = null;

  saveCompleted  = (s, arg) =>
  {
    wait.Close();
    svc.SaveCompleted -= saveCompleted;
  };

  svc.SaveCompleted += saveCompleted;
  wait.Show();
  svc.SaveAsync();
}

@zapico に同意することはすべて述べましたが、このタスクにはツールキット BusyIndi​​cator を使用します。

于 2011-06-09T22:04:40.720 に答える
0

非同期呼び出しを待っている間にウィンドウを表示するには、silverlight ツールキットの「BusyIndi​​cator」を使用します

いずれにせよ、WaitingScreen が ChildWindow の場合、値 (Accept または Cancel) を返して閉じる必要があります。多分それが問題です。

于 2011-06-09T21:26:29.610 に答える