45 дней с Windows Phone 7. День #24. WebBrowser. Часть 2. Локальный контент.
<< День #23. Реклама в WP7 приложениях.
Это двадцать четвёртая статья серии «45 дней с Windows Phone 7».
В Дне #18 мы подробно рассматривали возможности элемента управления «WebBrowser». После этого мне было задано достаточно много вопросов, преимущественно о том, как загружать локальные ресурсы, в первую очередь картинки, в данный элемент управления. Если картинка находится на удалённом web сервере, то проблем нет. Мы просто пишем её Url адрес. Но что делать, если картинка находится в ресурсах приложения? Ведь метод «NavigateToString» браузера не позволяет задать местоположение, загружаемых ресурсов.
На помощь нам приходит изолированное хранилище. Мы уже рассматривали данную тему в Дне #15. В изолированное хранилище можно положить HTML страницы и ресурсы к ним, такие как картинки, а после этого отобразить данные страницы в элементе управления «WebBrowser».
Отображение в «WebBrowser» страниц из изолированного хранилища.
Создадим новое приложение и разместим на главной странице элемент управления «WebBrowser» с именем «webBrowser1». Подпишемся на событие «Loaded» созданного элемента управления. Но перед тем как создать обработчик события, добавим функцию сохранения текстовых файлов в изолированном хранилище:
private static void SaveToIsoStore(string fileName, string text)
{
var isoStore = IsolatedStorageFile.GetUserStoreForApplication();
if (isoStore.FileExists(fileName))
isoStore.DeleteFile(fileName);
using (var sw = new StreamWriter(isoStore.CreateFile(fileName)))
{
sw.Write(text);
}
}
Данная функция принимает имя и содержимое файла, который потом создаётся в изолированном хранилище.
Теперь с помощью данной функции создадим файл «fileName123.htm» и отобразим его в элементе управления «WebBrowser»:
private void WebBrowser1Loaded(object sender, RoutedEventArgs e)
{
SaveToIsoStore("fileName123.htm", "<h1>Isolated Storage!!!</h1>");
webBrowser1.Navigate(new Uri("fileName123.htm", UriKind.Relative));
}
Всё верно, мы можем просто передать имя файла относительно корня изолированного хранилища элементу управления «WebBrowser».
Сохранение данных из ресурсов приложения в изолированное хранилище.
К сожалению, мы не можем также легко передать браузеру имя файла из ресурсов приложения, как это было в случае с файлами в изолированном хранилище. Поэтому вначале нам требуется сохранить файл из ресурсов в изолированном хранилище.
Добавим в проект два файла: «readme.htm» и «windows-phone-7.jpg» и установим свойство «Build Action» для файлов в значение «Content».
Файл «readme.htm» – это просто html страница, на которой находится картинка «windows-phone-7.jpg»:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Untitled Page</title> </head> <body> <h2>Windows Phone 7!</h2> <h3>Замечательная ОС</h3> <img src="windows-phone-7.jpg" /> </body> </html>
Теперь создадим функцию сохранения в изолированном хранилище любого файла, а не только текстового, как это было в первом примере:
private static void SaveToIsoStore(string fileName, byte[] data)
{
var strBaseDir = string.Empty;
const string delimStr = "/";
var delimiter = delimStr.ToCharArray();
var dirsPath = fileName.Split(delimiter);
var isoStore = IsolatedStorageFile.GetUserStoreForApplication();
for (var i = 0; i < dirsPath.Length - 1; i++)
{
strBaseDir = Path.Combine(strBaseDir, dirsPath[i]);
isoStore.CreateDirectory(strBaseDir);
}
if (isoStore.FileExists(fileName))
{
isoStore.DeleteFile(fileName);
}
using (var bw = new BinaryWriter(isoStore.CreateFile(fileName)))
{
bw.Write(data);
bw.Close();
}
}
Воспользуемся данной функцией и сохраним нужные нам файлы из ресурсов приложения. Кроме того, после сохранения файлов, перейдём в браузере на только что сохранённую страницу «readme.htm»:
private void WebBrowser1Loaded(object sender, RoutedEventArgs e)
{
string[] files = {
"readme.htm",
"windows-phone-7.jpg"
};
foreach (var f in files)
{
var sr = Application.GetResourceStream(new Uri(f, UriKind.Relative));
using (var br = new BinaryReader(sr.Stream))
{
var data = br.ReadBytes((int)sr.Stream.Length);
SaveToIsoStore(f, data);
}
}
webBrowser1.Navigate(new Uri("readme.htm", UriKind.Relative));
}
Запустим приложение и увидим страницу с находящейся на ней картинкой:

Примите во внимание, что в реальном приложении не стоит каждый раз при загрузке сохранять файлы из ресурсов в изолированное хранилище. Код требует оптимизации.
Прошло полгода – о том как программировать игры на XNA (меню, игровой цикл, спрайты) не написано не чего. разочарован …..
Когда наступят остальные дни?