【问题标题】:Silverlight ChildWindow do not close properly on callbackSilverlight ChildWindow 在回调时未正确关闭
【发布时间】:2011-06-09 20:46:27
【问题描述】:

我有一个简单的 ChildWindow,它只包含两个元素,文本块和进度条来模拟等待屏幕。该 ChildWindow 在调用异步 WCF 方法之前启动并在回调时关闭。

问题是 ChildWindow 第二次关闭整个表面保持禁用。我搜索过类似的情况,一位blog post 谈到 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();
}

任何指针都将不胜感激,我想我在这里缺少一些基本的东西。

【问题讨论】:

    标签: c# silverlight childwindow


    【解决方案1】:

    Close 方法被调用了两次,这不是我的情况。

    我想可能是这样。考虑调用DoSomething 两次,有多少委托已分配给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 的所有内容后,请使用工具包 BusyIndi​​cator 来完成此任务。

    【讨论】:

      【解决方案2】:

      要在等待异步调用时显示一个窗口,我会使用来自silverlight toolkit 的“BusyIndi​​cator”。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-15
        • 1970-01-01
        相关资源
        最近更新 更多