Эта статья посвящена Дню № 20 из 31-й серии Windows 8 . Каждая из статей этой серии будет опубликована как для HTML5 / JS, так и для XAML / C # . Вы можете найти дополнительные ресурсы, загрузки и исходный код на нашем сайте .
Сегодня это все о создании бумаги. Да, ребята, радости печати. Я знаю, что для некоторых это может показаться 1999 годом, но, как оказалось, люди все еще используют бумагу. Нет сомнений в том, что за последние 10 лет мы увидели, что этот ландшафт изменился благодаря таким вещам, как облако и такие инструменты, как OneNote или Evernote , но я думаю, можно с уверенностью сказать, что мы все еще печатаем.
Для меня печать из приложений, которые мы создали, была просто королевской болью. Это всегда была та особенность, которая ожидалась, но никогда не планировалась, и если бы она была таковой, в нее никогда не вставали «настоящие» мысли. К сожалению, я знаю, я надеюсь, что ты тоже не в этой лодке.
Пока я думал о том, как написать эту статью, меня осенило. На самом деле печать должна восприниматься как любой экран UX, который вы можете создать для своего приложения. Это может быть очевидно для некоторых, но у меня было несколько моментов ах-ха здесь. Печать на самом деле просто еще одна среда. Это бумага с другим разрешением. Конечно, нам нужно подойти к принтеру и взять его физически, но в отличие от индустрии мобильных устройств и планшетов, мы можем по крайней мере предсказать разрешение, которое мы планируем поддерживать. Поэтому относитесь к нему не иначе, как к любому другому экрану UX, который вы можете создать.
Нашей целью на сегодня является не помочь вам спроектировать, как могут выглядеть ваши экраны печати, а как мы можем взять данные и подготовиться к печати. Предупреждение, уродливый UX для бумаги и экрана.
Теперь при создании этой статьи не использовалась настоящая бумага, так как оказалось, что у меня закончились чернила.
Начало
Печать проста. Я не буду лгать, я никогда не думал, что сделаю это заявление. Я был на {кашель: wpf проектах прошлых лет}, где печать, когда это было возможно, была просто кошмаром. К счастью, это было прошлым годом, и мы все можем двигаться дальше.
Чтобы начать исследовать это, я создал такой же простой проект Blank App, который мы делали последние 20 дней. Запустите ваше приложение и откройте меню чудо-кнопок. Оттуда выберите Dearm Charm.
Как и следовало ожидать, Dearm Charm — это наш контракт на физические устройства, с которыми мы можем взаимодействовать. На данный момент (а мы еще ничего не сделали) вы можете увидеть все, что мы на самом деле ничего не можем сделать. Зарегистрируем для печати.
var _printManager = Windows.Graphics.Printing.PrintManager, _printView = _printManager.getForCurrentView(); _printView.onprinttaskrequested = function (eventArgs) { eventArgs.request.createPrintTask("31 Days", function (args) { args.setSource(MSApp.getHtmlPrintDocumentSource(document)); }); };
Теперь давайте снова запустим и снова выберем Charm Devices.
Теперь на наших устройствах полно вариантов, которые я могу распечатать. Давайте выберем Microsoft XPS Document Writer и мой настоящий принтер, чтобы посмотреть, что мы получим.
Несмотря на то, что мой вид печати одинаков, мои параметры для устройств явно различаются в зависимости от возможностей этого устройства. Независимо от того, мы напечатали! Теперь мой текущий макет действительно ничего особенного, так что если бы у меня было 90 абзацев Бекона Ipsum ?
Вы можете видеть выше, наш макет автоматически адаптирован. Добавленные мною 90 абзацев были просто содержимым одного элемента <p>. Это переведено на 10 страниц контента с ровными полями внизу, или так?
Для тех, кто работал с печатью в прошлом, знайте, что это круто. И хотя все это прекрасно, но скорее всего, мой макет экрана не совсем то, что я хочу напечатать.
раскладка
До сих пор наша печать была прямым представлением нашего экрана. И хотя наше приложение представляет собой не что иное, как центрированный заголовок и абзац, это ужасное использование бумаги. А сейчас давайте продолжим предполагать, что это приложение великолепно, а UX был разработан величайшими из великих людей.
Но мы можем с уверенностью сказать, что этот макет просто не работает на бумаге. Что мы действительно хотим сделать, так это переформатировать вещи, чтобы они лучше подходили для того носителя, на котором они будут отображаться, в данном случае для нашей статьи. было бы намного лучше, если бы мы переместили заголовок хотя бы в верхнюю часть страницы. Ну догадайся что, CSS на помощь.
<link href="/css/print.css" rel="stylesheet" type="text/css" media="print" />
В добавлении другой таблицы стилей нет ничего особенного, за исключением того, что мы собираемся использовать атрибут media : media = ”print” . С этой новой таблицей стилей CSS на месте, когда пользователь выбирает для печати Windows будет использовать эту таблицу стилей для представления. Теперь все, что я сделал в своей таблице стилей, это перенастроил мою CSS-сетку и выравнивание текста. Результат:
Очевидно, что это намного лучше работает на листе бумаги. Но разве я не мог просто использовать медиа-запрос, потому что это кажется гораздо более сложным в HTML5? Да, вы можете сделать то же самое. Это работает точно так же, как в браузере.
@media print { body { width: 100%; height: 100%; display: -ms-grid; -ms-grid-columns: 1fr; -ms-grid-rows: 1fr; } #content { -ms-grid-column: 1; -ms-grid-row: 1; text-align: left; } }
Конечно, это не что иное, как то, что мы уже сделали на наших веб-сайтах сегодня.
Добавление кнопки печати
До сих пор мы использовали встроенные устройства Dems Charms для отправки чего-либо на устройство, которое утверждает, что оно может печатать. Хотя рекомендуется всегда использовать брелок для устройств, в некоторых случаях в вашем приложении должна быть своя кнопка печати. Если это действительно так, мы можем легко сделать это, показав тот же пользовательский интерфейс печати, что и Devices Charm.
Для этого я добавил на свой экран кнопку, которая будет запускать обработчик, который вы увидите ниже.
_printThis.addEventListener("click", function () { Windows.Graphics.Printing.PrintManager.showPrintUIAsync(); }, false);
Теперь, чтобы показать PrintUI, ваш экран все равно должен будет зарегистрироваться в Диспетчере печати, как мы делали в начале этой статьи. После добавления нашей кнопки печати это приводит к нежелательному побочному продукту. Теперь у нас есть этот элемент кнопки на нашем экране. Мех ..
При разработке нашего UX нам действительно захочется подумать о наших экранах, контенте и о том, как мы планируем его трансформировать. К счастью, движение к более отзывчивой сети уже некоторое время ведет нас по этому пути. Но давайте избавимся от этой кнопки для нашего вида печати. Мы можем просто обновить наш медиа-запрос или нашу отдельную таблицу стилей, чтобы удалить этот элемент.
@media print { /* .... */ button { display: none; } }
Параметры
У вас есть варианты! Давайте начнем с рассмотрения того, что называется стандартными опциями . Эти параметры отображаются в правой части окна предварительного просмотра документа. Вы можете видеть, что я выделил их красным ниже.
По умолчанию всегда представлены одни и те же три свойства (если вы их не очистите); Копии , ориентация и цветовой режим . Теперь у нас есть возможность изменить это. Давайте предположим , что мы только хотим представить опцию Цветовой режим. Я просто очищаю свой список и добавляю обратно те, которые хочу.
_printView.onprinttaskrequested = function (eventArgs) { var printTask = eventArgs.request.createPrintTask("31 Days", function (args) { printTask.options.displayedOptions.clear(); printTask.options.displayedOptions .append(_printing.StandardPrintTaskOptions.colorMode); args.setSource(MSApp.getHtmlPrintDocumentSource(document)); }); };
Теперь, независимо от того, что я выбрал для отображения в меню настроек стандартов, когда пользователь выбирает подробное меню настроек, они будут представлены вместе с ним.
Мы также можем выбрать то, что мы считаем настройкой по умолчанию. Возможно мы действительно хотели, чтобы Цветовой режим был установлен в оттенках серого, а не в цвете.
printTask.options.colorMode = _printing.PrintColorMode.grayscale;
Конечно, мы также можем добавить в стандартный список. Допустим, вам нужны параметры по умолчанию + двусторонняя печать. Вместо того, чтобы очистить список по умолчанию, вы просто добавили бы к нему.
printTask.options.displayedOptions .append(_printing.StandardPrintTaskOptions.duplex);
Теперь со всем этим, единственная опция, поддерживаемая вашим устройством, это те, которые будут показаны. Отличный способ убедиться в этом в действии — выбрать XPS Document Writer, а не принтер. Независимо от того, что вы только что установили, это не для XPS.
А как насчет пользовательских функций печати ? Хорошо, что в настоящее время HTML5 \ JavaScript не поддерживается, как в XAML \ C #.
Другие события
Как и на любой странице, важно понимать нашу навигационную модель и когда мы должны загружать и выгружать наши события. То же самое относится и к печати. Есть 4 события как часть PrintTask ; Завершено, предварительный просмотр, прогресс и отправка.
Я не собираюсь проходить через все события, но я хочу посмотреть на завершенные, так как это единственное место, которое мы можем увидеть, если бы мы действительно могли печатать.
_printView.onprinttaskrequested = function (eventArgs){ var printTask = eventArgs.request.createPrintTask("31 Days", function (args) { printTask.oncompleted = printCompleted; /* .... */ }); function printCompleted(eventArgs) { switch (eventArgs.completion) { case _printing.PrintTaskCompletion.failed: break; case _printing.PrintTaskCompletion.submitted: break; case _printing.PrintTaskCompletion.abandoned: break; case _printing.PrintTaskCompletion.canceled: break; default: break; } }
Как видите, мы регистрируемся на событие, как только наша задача печати создана. Тогда мы можем просто переключить результат и отреагировать так, как считаем нужным. Честно говоря, так и должно быть. Это хорошая вещь.
Резюме
Сегодня мы вступили в договор об устройствах, в частности нашу способность печатать. Я пытался разбить печать таким образом, чтобы она была просто, зная, что сложность печати связана с нашими вариантами использования. Преобразование пикселей на экране в лист бумаги — задача не из легких, а для эффективной работы требуется продуманный дизайн. Это не просто подвиг, и к нему следует относиться так же, как к любой другой функции в вашем проекте разработки. К сожалению, это не то, что мы можем вам помочь.
Если вы хотите загрузить пример кода, который обсуждался в этой статье, щелкните значок ниже:
Завтра мы рассмотрим захват изображений с вашей камеры. Увидимся позже!