Silverlight ChildWindow не закрываются должным образом при обратном вызове - PullRequest
2 голосов
/ 10 июня 2011

У меня есть простое ChildWindow, содержащее только два элемента, текстовый блок и индикатор выполнения для имитации экрана ожидания. Это ChildWindow запускается перед вызовом асинхронного метода WCF и закрывается при обратном вызове.

Проблема во втором случае, когда ChildWindow закрывается, вся поверхность остается отключенной. Я искал похожую ситуацию, одна запись в блоге говорила о том, что метод Close вызывается два раза, это не мой случай.

Вот пример кода (svc - Службы WCF):

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

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

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

Любой указатель был бы признателен, я думаю, что мне здесь не хватает чего-то простого.

Ответы [ 2 ]

1 голос
/ 10 июня 2011

Закрытый метод вызывается два раза, это не мой случай.

Я думаю, что это, вероятно, так.Подумайте о том, чтобы дважды вызвать DoSomething, сколько delgates было назначено для SaveCompleted и сколько было удалено?Ответ: 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, использует инструментарий BusyIndicator для этой задачи.

0 голосов
/ 10 июня 2011

Чтобы показать окно во время ожидания асинхронного вызова, я бы использовал "BusyIndicator" из silverlight toolkit .

В любом случае, если WaitingScreen является ChildWindow, он должен вернуть значение (Принять или отменить), чтобы закрыть.Может быть, в этом проблема.

...