Главная > Silverlight, Windows Phone 7 > 45 дней с Windows Phone 7. День #24. WebBrowser. Часть 2. Локальный контент.

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));
}

Запустим приложение и увидим страницу с находящейся на ней картинкой:

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

Пример кода.

  1. Юстау
    8 Март 2011 в 19:45 | #1

    Прошло полгода – о том как программировать игры на XNA (меню, игровой цикл, спрайты) не написано не чего. разочарован …..

  2. Нуржан
    9 Ноябрь 2011 в 02:09 | #2

    Когда наступят остальные дни?

  1. Пока что нет уведомлений.
Необходимо войти на сайт, чтобы написать комментарий.