Чтобы выполнить привязку данных изображения, выполните следующие действия
- Дважды щелкните home.html в Solution Explorer (Обозреватель решений), чтобы открыть его.
- Выполните привязку данных для элементов, которые отображают изображение и сведения о нем.
- Выполните привязку свойства innerHTML элемента
imageName к свойству displayName источника данных.
<div id="imageName" class="pageSubheader"
data-win-bind="innerHTML: displayName">Image name</div>
- Выполните привязку свойства src элемента
displayImage к свойству src источника данных.
<img id="displayImage" src="#" data-win-bind="src: src" />
- Выполните привязку свойства innerHTML элемента
fileName к свойству name источника данных.
<div id="fileName" data-win-bind="innerHTML: name">File name</div>
- Выполните привязку свойства innerHTML элемента
path к свойству path источника данных.
<div id="path" data-win-bind="innerHTML: path">Path</div>
- Выполните привязку свойства innerHTML элемента
dateCreated к свойству dateCreated источника данных.
<div id="dateCreated"
data-win-bind="innerHTML: dateCreated">Date created</div>
Получим обновленный код HTML для основного раздела файла home.html:
<section aria-label="Main content" role="main">
<div id="contentGrid">
<button id="getPhotoButton">Get photo</button>
<div id="imageName" class="pageSubheader"
data-win-bind="innerHTML: displayName">Image name</div>
<div id="imageGrid">
<img id="displayImage" src="#" data-win-bind="src: src" />
<div id="imageInfoContainer">
<label for="fileName">File name:</label>
<div id="fileName" data-win-bind="innerHTML: name">File name</div>
<label for="path">Path:</label>
<div id="path" data-win-bind="innerHTML: path">Path</div>
<label for="dateCreated">Date created:</label>
<div id="dateCreated"
data-win-bind="innerHTML: dateCreated">Date created</div>
</div>
</div>
</div>
</section>
- Дважды щелкните home.js в Solution Explorer (Обозреватель решений), чтобы открыть его.
- Сразу после директивы use strict добавьте код, чтобы задать для свойства WinJS.Binding.optimizeBindingReferences значение true.
(function () {
"use strict";
WinJS.Binding.optimizeBindingReferences = true;
- В методе
loadImage после существующего кода получите элемент contentGrid . Вызовите метод WinJS.Binding.processAll в конец loadImage и передайте ему contentGrid и photoObject .
loadImage: function (file) {
if (file) {
photoObject.displayName = file.displayName;
photoObject.name = file.name;
photoObject.path = file.path;
photoObject.dateCreated = file.dateCreated;
var imageBlob = URL.createObjectURL(file, { oneTimeOnly: true });
photoObject.src = imageBlob;
var contentGrid = document.getElementById("contentGrid");
WinJS.Binding.processAll(contentGrid, photoObject);
}
},
- Запустите приложение. Нажмите кнопку "Get photo" (Получить фотографию) и выберите изображение.
Так выглядит приложение с выбранным изображением и привязкой текстовых блоков к данным.
Шаг 3: сохранение и загрузка состояния
В части 2 этой серии учебников Управление жизненным циклом и состоянием приложения
вы узнали, как сохранять и восстанавливать состояние приложения.
Необходимо также сохранить состояние в новом фотоприложении. Необходимо
сохранить и восстановить только файл изображения, которое отображается в
данный момент.
Но нельзя просто сохранить путь к файлу и затем заново открыть его по этому пути. Когда пользователь выбирает файл с помощью FileOpenPicker,
он неявно предоставляет вашему приложению разрешение для этого файла.
Если позднее вы попытаетесь просто извлечь файл по этому пути, то в
разрешении вам будет отказано.
Вместо этого, чтобы сохранить доступ к файлу на будущее, класс StorageApplicationPermissions
предусматривает два списка, где можно сохранить файл и разрешения для
него, предоставленные пользователю, когда он открыл файл при помощи
средства выбора файлов. Нам нужен доступ только к последнему файлу, выбранному
пользователем, чтобы с его помощью восстановить состояние страницы. Для
этого подойдет MostRecentlyUsedList.
Когда пользователь выбирает файл, мы добавляем его в MostRecentlyUsedList. При добавлении файла в этот список MostRecentlyUsedList
возвращает маркер, который используется для извлечения файла в
дальнейшем. Мы сохраняем этот маркер и используем его для извлечения
текущего файла изображения при восстановлении состояния страницы.
Сохранение состояния
- Дважды щелкните home.js в Solution Explorer (Обозреватель решений), чтобы открыть его.
- В методе
loadImage добавьте код в конец метода, чтобы добавить выбранный файл в mostRecentlyUsedList. Сохраните возвращаемый токен в объекте sessionState.
// Add picked file to MostRecentlyUsedList.
WinJS.Application.sessionState.mruToken =
Windows.Storage.AccessCache.StorageApplicationPermissions
.mostRecentlyUsedList.add(file);
Вот полный метод loadImage :
loadImage: function (file) {
if (file) {
photoObject.displayName = file.displayName;
photoObject.name = file.name;
photoObject.path = file.path;
photoObject.dateCreated = file.dateCreated;
var imageBlob = URL.createObjectURL(file, { oneTimeOnly: true });
photoObject.src = imageBlob;
var contentGrid = document.getElementById("contentGrid");
WinJS.Binding.processAll(contentGrid, photoObject);
// Add picked file to MostRecentlyUsedList.
WinJS.Application.sessionState.mruToken =
Windows.Storage.AccessCache.StorageApplicationPermissions
.mostRecentlyUsedList.add(file);
}
},
Загрузка состояния
- Дважды щелкните default.js в Solution Explorer (Обозреватель решений), чтобы открыть его.
- В активированном обработчике событий добавьте код, чтобы сохранить предыдущее состояние выполнения в объекте WinJS.Application.sessionState. Это позволит домашней странице обращаться к нему. Добавьте этот код в первый оператор if.
// Save the previous execution state.
WinJS.Application.sessionState.previousExecutionState =
args.detail.previousExecutionState;
Вот полный активированный обработчик событий:
app.addEventListener("activated", function (args) {
if (args.detail.kind === activation.ActivationKind.launch) {
// Save the previous execution state.
WinJS.Application.sessionState.previousExecutionState =
args.detail.previousExecutionState;
if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
// TODO: This application has been newly launched. Initialize
// your application here.
} else {
// TODO: This application has been reactivated from suspension.
// Restore application state here.
}
if (app.sessionState.history) {
nav.history = app.sessionState.history;
}
args.setPromise(WinJS.UI.processAll().then(function () {
if (nav.location) {
nav.history.current.initialPlaceholder = true;
return nav.navigate(nav.location, nav.state);
} else {
return nav.navigate(Application.navigator.home);
}
}));
}
});
- Дважды щелкните home.js в Solution Explorer (Обозреватель решений), чтобы открыть его.
- Добавьте код в функцию ready, чтобы проверить, было ли приложение закрыто перед этим. Если да, используем метод mostRecentlyUsedList.getFileAsync, чтобы извлечь файл. Этот метод возвращает объект Promise для файла. Передадим методы
loadImage и displayError в метод done объекта Promise.
if (
WinJS.Application.sessionState.previousExecutionState
=== Windows.ApplicationModel.Activation.ApplicationExecutionState.terminated) {
var mruToken = WinJS.Application.sessionState.mruToken;
if (mruToken) {
Windows.Storage.AccessCache.StorageApplicationPermissions.
mostRecentlyUsedList.getFileAsync(mruToken)
.done(this.loadImage, this.displayError);
}
}
Вот обновленный метод ready:
ready: function (element, options) {
// TODO: Initialize the page here.
document.getElementById("getPhotoButton")
.addEventListener("click", this.getPhotoButtonClickHandler, false);
if (
WinJS.Application.sessionState.previousExecutionState
=== Windows.ApplicationModel.Activation.ApplicationExecutionState.terminated) {
var mruToken = WinJS.Application.sessionState.mruToken;
if (mruToken) {
Windows.Storage.AccessCache.StorageApplicationPermissions.
mostRecentlyUsedList.getFileAsync(mruToken)
.done(this.loadImage, this.displayError);
}
}
},
- Чтобы построить и запустить приложение, нажмите клавишу F5. Нажмите кнопку "Get photo" (Получить фотографию) для запуска FileOpenPicker и выберите файл. Теперь в случае приостановки, прекращения работы и восстановления приложения изображение загружается заново.
Сводка
Поздравляем, вы прошли пятый учебник! Вы научились использовать
средства выбора файлов и привязку данных в приложении Магазина Windows.
Источник: http://msdn.microsoft.com/ru-ru/library/windows/apps/ |