Статьи

31 день Windows 8 для HTML5 | День # 18 Файловые ассоциации

Эта статья посвящена Дню № 18 из 31-й серии Windows 8 . Каждая из статей этой серии будет опубликована как для HTML5 / JS, так и для XAML / C # . Вы можете найти дополнительные ресурсы, загрузки и исходный код на нашем сайте .логотип

Сегодня мы рассмотрим несколько интересных функций в Windows 8: ассоциации файлов и контракты приложений. В связи с файловыми ассоциациями мы рассмотрим обе стороны этой функции Windows 8:

  • Регистрация нашего приложения в Windows 8 как приложения, которое открывает файлы определенного типа, например .png или пользовательское расширение .31days.
  • Предоставление нашему приложению возможности предлагать список совместимых приложений, когда наш пользователь пытается открыть файл, который наше приложение не поддерживает, например файл .xls.

Наконец, мы также обсудим некоторые другие способы, с помощью которых наше приложение может зарегистрироваться в системе пользователя, включая такие вещи, как автозапуск.

Регистрация для открытия файлов определенных типов

Будут времена, когда мы хотим, чтобы наш пользователь открывал файлы определенного типа в нашем приложении. Возможно, мы создаем редактор изображений, поэтому независимо от того, в каком типе изображений находятся файлы пользователя, если они являются обычным типом изображения, мы сможем открыть его. Возможно, мы создаем редактор XML, который использует файлы .xml. Может быть, вы только что создали новое расширение, как я сделал для On Time, и вы хотите, чтобы оно было зарегистрировано. В любом случае, мы хотим зарегистрировать наше приложение в системе пользователя, чтобы, когда они получают запрос, подобный этому:

  clip_image002

Мы хотим убедиться, что наше приложение находится в этом списке, когда пользователь открывает файлы, подходящие для нашего приложения. Чтобы сделать это, достаточно просто внести некоторые изменения в наш файл package.appxmanifest. Откройте файл и выберите вкладку объявлений. В списке выбора «Доступные объявления» выберите «Ассоциации типов файлов» и нажмите «Добавить».

Вы увидите, что он заполняет экран новой формой для указания ассоциаций файлов, с которыми вы хотите зарегистрировать свое приложение. По умолчанию у него есть несколько красных крестиков, к которым вам нужно обратиться.

образ

Для этого примера я собираюсь выбрать только один тип файла, и один мы создадим. Мы назовем это 31, это кажется подходящим.

образ

Первый — это отображаемое имя. Это имя, которое отображается как тип. Затем я связал логотип, который я тоже хочу показать. Вы можете использовать любой значок, который вам нравится, но у них есть квадратное соотношение сторон, поэтому я выбрал свой файл smallLogo.png с таким же соотношением. Достаточно просто, см. Ниже.

образ

Последнее значение свойства, которое нам нужно установить, это Name. Имя — это просто имя для набора расширений, которые вы перечисляете здесь. Причина, по которой у нас могут быть разные наборы расширений, заключается в том, что вы, возможно, захотите, чтобы ваше приложение работало по-разному в зависимости от типа файла. Внизу формы вы можете указать точку входа для вашего приложения для этого набора файлов. Если это файл JSON, то вы хотите предварительно загрузить информацию. Если это изображение, возможно, вы бы предпочли перенести его на страницу редактирования изображения или просто прикрепить к электронному письму. Это зависит от вас.

Как только вы это сделали, вы в основном сделали. 

Запустите приложение один раз, чтобы установить его в своей системе. На данный момент вещь зарегистрирована, и вы готовы к работе. Если вы заметили выше, наш пользовательский файл теперь связан, и если мы нажмем на него, откроется наше приложение. Конечно, наше приложение не имеет ни малейшего понятия, что с ним делать, но тем не менее наше приложение открыто и открыто.

Теперь сделай что-нибудь

Хорошо, наше приложение открылось, что теперь? Сначала давайте просто посмотрим на содержимое моего файла .31, чтобы мы знали, с чем мы работаем.

{"days": [
    {"day":"1",     "title":"asdf"},
    {"day":"2",     "title":"asdf"},
    {"day":"3",     "title":"asdf"},
    {"day":"4",     "title":"asdf"},
    {"day":"5",     "title":"asdf"},
    {"day":"6",     "title":"asdf"},
    {"day":"7",     "title":"asdf"},
    {"day":"8",     "title":"asdf"},
    {"day":"9",     "title":"asdf"},
    {"day":"10",    "title":"asdf"}
]}

Я немного обманываю и просто использую JSON, который я хочу позже связать, используя Knockout.js. Чтобы подключить наше приложение к вызову, мы хотим подключить его к активации. В шаблонах Visual Studio уже есть ряд вещей, которые мы можем предложить на протяжении всего жизненного цикла приложения. Нам просто нужно расширить проверку, чтобы увидеть, был ли активация файлом, а не чем-то другим.

args.detail.kind === activation.ActivationKind.file

Мы сделаем это с помощью простого оператора if . Если это правда, то в нашем случае здесь все, что я хочу сделать, это взять файл, прочитать его содержимое и затем привязать данные к экрану. Здесь важно не то, что я использую Knockout.js и выкидываю что-то на экран, а то, что мы активируемся и получаем необходимые данные.

var app = WinJS.Application;
var activation = Windows.ApplicationModel.Activation;

app.onactivated = function (args) {

    if (args.detail.kind === activation.ActivationKind.launch) {

        /* ... */

        args.setPromise(WinJS.UI.processAll());
    }

    if (args.detail.kind === activation.ActivationKind.file) {
        Windows.Storage.FileIO.readTextAsync(args.detail.files[0])
            .then(function (contents) {
                var myObject = JSON.parse(contents);
                ko.applyBindings(myObject);
        });
    }

};

Вы можете еще глубже взглянуть на то, как это работает в моем примере .

Открытие файла в другом приложении

Иногда ваше приложение просто не может открыть каждый тип файла. Например, Microsoft Outlook действительно хорош для приема изображений, текста и файлов, но если вы когда-либо пытались открыть файл Excel, прикрепленный к электронному письму, вы, вероятно, заметили (и ожидаете), что файл открывается в Excel, а не в Outlook. Мы хотим предоставить такую ​​же функциональность нашим пользователям. Для этого мы собираемся изучить класс Windows.System.Launcher.

В нашем первом простом примере мы просто запустим файл Excel без каких-либо параметров или настроек. Система будет использовать приложение по умолчанию для запуска нашего файла, без какого-либо выбора или предупреждения.

var _launcher = Windows.System.Launcher,
    _current = Windows.ApplicationModel.Package.current;

var excelFile = "data\\sampleData.xlsx";
_current.installedLocation.getFileAsync(excelFile)
    .then(function (file) {
        _launcher.launchFileAsync(file)
            .then(function (isSuccess) {
                if (isSuccess) { /* Rock on Garth! */ }
                else { /* failWail */ }
            });
    });

Как вы можете видеть в этом первом примере, все довольно просто. Мы вызываем _launcher.kaunchFileAsync () и передаем ему объект StorageFile . Однако иногда вам может потребоваться предупредить вашего пользователя о том, что вы собираетесь запустить еще одну часть программного обеспечения, чтобы он мог решить, действительно ли это то, что он хочет делать. В этом случае мы можем создать объект LauncherOptions и при условии, что это будет частью нашего вызова launchFileAsync () . Как это:

var _launcher = Windows.System.Launcher,
    _current = Windows.ApplicationModel.Package.current;

var excelFile = "data\\sampleData.xlsx";
_current.installedLocation.getFileAsync(excelFile)
    .then(function (file) {

        var launchOptions = new Windows.System.LauncherOptions();
        launchOptions.treatAsUntrusted = true;

        _launcher.launchFileAsync(file, launchOptions)
            .then (function (isSuccess) {
                if ( isSuccess ) { /* Rock on Garth! */ }
                else { /* failWail */ }
            });
    });

Когда мы делаем это, на экране появляется предупреждение, информирующее пользователя об открытии другого приложения.

образ

Наконец, может быть время, когда вы захотите, чтобы ваш пользователь мог выбрать приложение, с которым он откроет файл. В этом случае мы хотим вызвать то же поле, которое появляется, когда пользователь выбирает «Открыть с помощью…» в предыдущем разделе. Для этого мы просто устанавливаем другую опцию: d isplayApplicationPicker . Если вы хотите изменить положение этого диалогового окна, вы можете сделать это также с небольшим количеством работы, но это очень похоже на то, что мы делали в День № 16 с контекстными меню . Однако если вы не укажете местоположение, откроется диалоговое окно с центром на экране пользователя. Лично я предпочитаю, чтобы это выглядело ближе к элементу управления, по которому щелкнул пользователь, но я понимаю, что пытается сделать команда Windows. 

Так что у вас есть это. Как запустить файл в отдельном приложении от вашего. В последнем разделе этой статьи мы кратко рассмотрим Контракты на приложения и то, как мы можем сделать наши приложения доступными в других списках для наших пользователей.

Использование контрактов приложений для хорошего

Читая эту статью, некоторые разработчики подумают, что было бы неплохо зарегистрировать свое приложение для каждого возможного расширения файла, потому что оно будет держать их приложение и логотип перед пользователями как можно чаще.

ПОЖАЛУЙСТА, НЕ ДЕЛАЙТЕ ЭТОГО.

Это правило распространяется и на контракты приложений. Не злоупотребляйте ими, особенно если вы фактически не предоставляете требуемую функциональность. Это будет рассмотрено, когда вы отправите свою заявку в магазин, чтобы она была обнаружена.

Поставщик фотографий аккаунта

Вы можете объявить эту функцию, если вы можете предоставить пользователю возможность создавать новую учетную запись в Windows 8. Вы попадаете в меню на начальном экране, например:

образ

И когда ваше приложение будет зарегистрировано, параметры будут выглядеть так, с вашим приложением в списке:

образ

Чтобы сделать это, просто добавьте поставщик изображений учетной записи на вкладку объявлений в файле package.appxmanifest, например:

clip_image006

Я говорил вам, что этот файл appxmanifest станет вашим лучшим другом. По умолчанию оно просто запустит ваше приложение, но вы также можете предоставить собственные точки входа, как мы это делали для фоновых задач в день №12,   и для таких вещей, как сопоставление файлов, которое мы обсуждали сегодня. Это просто гарантирует, что ваши пользователи автоматически попадут в нужный раздел вашего приложения.

Автозапуск и протоколы

Есть три других контракта на приложения, на которые мы можем подписаться, и для каждого из них требуется только другая запись в декларации.

«AutoPlay Content» распознает, когда в устройство вставлен новый носитель, например USB-диск или DVD. Если тип контента, который вы зарегистрировали, присутствует, ваше приложение появится в отображаемом списке автозапуска.  На MSDN есть отличная статья об автозапуске и различных значениях, которые вы можете использовать .

«AutoPlay Device» — это та же идея, но вы регистрируетесь для определенных типов устройств, таких как камеры, принтеры или USB-накопители. Та же статья выше относится и к этому.

«Протокол» немного другой. Это позволяет нам регистрироваться для схем URI, таких как «mailto:», или даже использовать наши собственные схемы URI, такие как «31days:». Это еще один способ зарегистрировать наше приложение в системе, которая будет использоваться в соответствующее время.  У Microsoft также есть отличная статья о протоколах.

Резюме

Сегодня мы рассмотрели некоторые расширяемые возможности, к которым мы можем получить доступ, чтобы сделать наше приложение более заметным и полезным для наших пользователей. Если они ожидают, что смогут открывать изображения с помощью нашего приложения, тогда мы должны появиться в их списке приложений, когда они попытаются открыть изображение.

Если вы хотите ознакомиться с полным рабочим решением для кода, описанного в этой статье, щелкните значок загрузки ниже:

downloadHTML

Завтра мы рассмотрим еще один мощный механизм в Windows 8: средство выбора файлов. Это позволяет нашему пользователю захватывать файлы со своего жесткого диска и предоставлять их нашим приложениям. Увидимся позже!

downloadTheTools