从Silverlight 4打印异步数据

时间:2010-10-04 22:20:29

标签: silverlight silverlight-4.0 asynchronous printing

我这里有一点鸡蛋问题......

我想打印从Web服务异步检索的地图数据。问题是我不知道所选的纸张尺寸(这会影响我需要从服务中请求的地图的大小),直到用户在打印对话框上按下OK并触发PrintPage事件。

我唯一能想到的是以某种方式“暂停”PrintPage事件中间的整个打印过程,检索地图图像,将当前页面的PageVisual设置为地图图像,然后让打印过程继续。但这似乎不可能或“正确”。

我想让用户在打印前从组合框中选择页面大小(这样我只能在检索到所有地图数据后检索正确的图像大小并启用“打印”按钮)。但是,用户需要选择两次页面大小,一次是从我的组合框中选择,一次是从打印对话框中选择。如果他们从组合框中选择了11x17,然后在打印对话框上打了一个OK(很可能),它会将11x17版面打印到默认的8.5x11纸张尺寸。

我发现这个问题的另一个提及是http://betaforums.silverlight.net/forums/p/192371/444897.aspx,他们也找不到解决方案。

2 个答案:

答案 0 :(得分:1)

没有直接解决这个问题的方法。打印引擎在这里负责并要求下一页的视觉效果。从开发人员的角度来看,更好的模型是将事件转换为方法,并使代码调用 PrintPage。我确信有些棘手的技术原因导致无法做到这一点。

我认为你有两个选择。一种是在等待异步操作完成时,在WaitHandle事件中使用PrintPage来阻塞线程。我不敢相信我这么说,但在这种情况下,它的合理可行性。类似的东西: -

 using(var waitHandle = new AutoResetEvent(false))
 {
      // Some intial code
      var result = YourAsyncOperation(parametersNeeded, () => waitHandle.set());
      bool signaled = waitHandle.WaitOne(30000);  // 30
      // Conitnue as appropriate (result might be indicate an error, signaled might be false indicating a timeout). 
 }

您的另一个选择是确保您拥有足够的Silverlight代码数据客户端来进行布局工作。

答案 1 :(得分:1)

您可以按照以下方式推迟打印:

   void p_PrintPage(object sender, PrintPageEventArgs e)
    {
        if (isLoadedMap())
        {
           e.PageVisual = null;
           e.HasMorePages = true;
        } else {
           e
        }
    }