Silverlight ChildWindow在回调时未正确关闭

本文关键字:ChildWindow 回调 Silverlight | 更新日期: 2023-09-27 17:58:44

我有一个简单的ChildWindow,它只包含两个元素,textblock和一个进度条来模拟等待屏幕。该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();
}

任何指针都将不胜感激,我想我错过了一些基本的东西。

Silverlight ChildWindow在回调时未正确关闭

Close方法被调用了两次,但我的情况并非如此。

我想可能是的。考虑一下调用DoSomething两次,有多少delgate被分配给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来完成这项任务。

要在等待异步调用时显示窗口,我将使用silverlight工具箱中的"BusyIndicator"。

无论如何,如果WaitingScreen是一个ChildWindow,它应该返回一个值(Accept或Cancel)来关闭。也许这就是问题所在。