我这里有一点鸡蛋问题......
我想打印从Web服务异步检索的地图数据。问题是我不知道所选的纸张尺寸(这会影响我需要从服务中请求的地图的大小),直到用户在打印对话框上按下OK并触发PrintPage事件。
我唯一能想到的是以某种方式“暂停”PrintPage事件中间的整个打印过程,检索地图图像,将当前页面的PageVisual设置为地图图像,然后让打印过程继续。但这似乎不可能或“正确”。
我想让用户在打印前从组合框中选择页面大小(这样我只能在检索到所有地图数据后检索正确的图像大小并启用“打印”按钮)。但是,用户需要选择两次页面大小,一次是从我的组合框中选择,一次是从打印对话框中选择。如果他们从组合框中选择了11x17,然后在打印对话框上打了一个OK(很可能),它会将11x17版面打印到默认的8.5x11纸张尺寸。
我发现这个问题的另一个提及是http://betaforums.silverlight.net/forums/p/192371/444897.aspx,他们也找不到解决方案。
答案 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
}
}