代码之家  ›  专栏  ›  技术社区  ›  Paul Abbott

从Silverlight 4打印异步数据

  •  2
  • Paul Abbott  · 技术社区  · 15 年前

    我这里有点鸡和蛋的问题…

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

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

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

    我发现的这个问题的另一个说法是 http://betaforums.silverlight.net/forums/p/192371/444897.aspx 他们也没有找到解决办法。

    2 回复  |  直到 14 年前
        1
  •  1
  •   AnthonyWJones    15 年前

    这个问题没有直接的解决办法。打印引擎在这里负责并要求为下一页提供视觉效果。从开发人员的角度来看,一个更好的模型应该是将事件转化为方法,并让代码 呼叫 PrintPage . 我敢肯定,这是不可能做到的棘手的技术原因。

    我看你有两个选择。一种是简单地用 WaitHandle 打印页 在等待异步操作完成时发生。我不敢相信我这么说,但在这种情况下,它是合理可行的。比如:

     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代码自行完成布局工作。

        2
  •  1
  •   Chui Tey    14 年前

    您可以这样推迟打印:

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