Печать асинхронных данных из Silverlight 4 - PullRequest
2 голосов
/ 05 октября 2010

У меня есть небольшая проблема с курицей и яйцом ...

Я хочу напечатать данные карты, которые асинхронно извлекаются из веб-службы. Проблема в том, что я не знаю выбранный размер бумаги (который влияет на размер карты, которую мне нужно запросить у службы), пока пользователь не нажмет OK в диалоговом окне печати и не произойдет событие PrintPage.

Единственное, о чем я могу думать, это как-то «приостановить» весь процесс печати в середине события PrintPage, извлечь изображение карты, установить PageVisual текущей страницы на изображение карты, а затем позволить процессу печати продолжить , Но это не представляется ни возможным, ни «правильным».

Я подумал о том, чтобы пользователь выбрал размер страницы из поля со списком перед печатью (таким образом, я мог получить правильный размер изображения и включить кнопку «печать» только после того, как все данные карты были извлечены). Но тогда пользователю нужно будет выбрать размер страницы дважды, один раз из моего поля со списком и один раз из диалогового окна печати. Если они выберут 11x17 в поле со списком, а затем просто нажмут OK в диалоговом окне печати (что весьма вероятно), будет напечатан макет 11x17 с размером бумаги по умолчанию 8,5x11.

Единственное упоминание об этой проблеме, которое я обнаружил, это http://betaforums.silverlight.net/forums/p/192371/444897.aspx,, и они также не нашли решения.

Ответы [ 2 ]

1 голос
/ 15 марта 2011

Вы можете отложить печать следующим образом:

   void p_PrintPage(object sender, PrintPageEventArgs e)
    {
        if (isLoadedMap())
        {
           e.PageVisual = null;
           e.HasMorePages = true;
        } else {
           e
        }
    }
1 голос
/ 05 октября 2010

Нет прямого решения этой проблемы.Здесь работает механизм печати и требуется визуальная информация для следующей страницы.Лучшая модель с точки зрения разработчиков состояла бы в том, чтобы инвертировать события в методы и иметь код call 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 для выполнения самого макета.

...