День восемнадцатый. Элемент WebBrowser

Вступление

Продолжаем знакомиться с разными элементами, которые используются в Windows Phone 7. Сегодня узнаем побольше о важном элементе WebBrowser.

Знакомство с WebBrowser

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

Добавим WebBrowser на страницу простым перетаскиванием из панели инструментов. В XAML появится код:


<phone:WebBrowser HorizontalAlignment="Left" 
    Margin="350,303,0,0" 
	Name="webBrowser1" 
	VerticalAlignment="Top" />

При этом будет подключено пространство имён xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone".

Для того чтобы в браузере отобразить страницу, достаточно вызвать один метод:

webBrowser1.Navigate(new Uri("http://developer.alexanderklimov.ru/windowsphone/wp.php"));

Главная особенность элемента WebBrowser заключается в том, что вы можете загрузить часть информации локально, и часть с интернета. Таким образом вы можете внедрить HTML-страницы в приложение и загружать их локально на телефоне без необходимости подключения к интернету.

Загрузка локальных HTML-страниц в WebBrowser

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

Добавим в приложение две кнопки для загрузки каждого файла. Так как мы будем работать с файлом, нам необходимо добавить к проекту пространство имен System.IO:


using System.IO;

Также мы добавим пространство имен Microsoft.Xna.Framework:


using Microsoft.Xna.Framework;

Возможно вас удивит, что мы хотим использовать XNA в Silverlight-проекте. Чуть позже вы поймете, почему нам понадобился XNA. А сейчас просто поверьте на слово. В обработчике события для кнопки пишем две строчки кода. В первой строчке загружаем содержимое HTML в StreamReader, а во второй - загружаем содержимое HTML-файла в WebBrowser, используя метод NavigateToString():


StreamReader reader = new StreamReader(TitleContainer.OpenStream("html/wp7wiki.html"));
Browser.NavigateToString(reader.ReadToEnd());

Кроме загрузки уже существующей страницы, мы можем генерировать HTML прямо в коде приложения:


string html = "<h1 st yle=\"color:red;\">Мяу!</h1>" +
"<a href=\"http://developer.alexanderklimov.ru\">Освой программирование играючи</a>";
webbrowser1.NavigateToString(ConvertExtendedAscii(html));

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


public static string ConvertExtendedAscii(string html)
{
    var retVal = "";
    var s = html.ToCharArray();

    foreach (char c in s)
    {
        if (Convert.ToInt32(c) > 127)
            retVal += "&#" + Convert.ToInt32(c) + ";";
        else
            retVal += c;
    }

    return retVal;
} 

Включаем выполнение сценариев JavaScript

По умолчанию выполнение сценариев JavaScript в WebBrowser отключено. Если вы хотите, чтобы сценарии в ваших веб-документах выполнялись, вам необходимо установить соответствующее разрешение. Делается это очень просто при помощи свойства IsScriptEnabled:


[XAML]
<phone:WebBrowser x:Name="Browser" IsScriptEnabled="True" />


[C#]
Browser.IsScriptEnabled = true;

Взаимодействие между приложением и сценарием

При взаимодействии со страницей, загруженной в WebBrowser мы можем вызывать из C# функции JavaScript, а из JavaScript уведомлять Silverlight приложение. Вызвать JavaScript-функцию из C# можно при помощи метода InvokeScript, передавая имя метода сценария. В данном примере мы вызываем функцию «functionName» с параметром «parametr1» и получаем возвращаемое значение:


string returnValue = (string)wbMain.InvokeScript("functionName", "parametr1");

Для оповещения приложения из сценария JavaScript надо подписаться на событие ScriptNotify и в обработчике события получить параметр, переданный из сценария. NotifyEventArgs.Value будет содержать нужное значение:


void Browser_ScriptNotify(object sender, NotifyEventArgs e)
{
	Browser.Navigate(new Uri(e.Value, UriKind.Absolute));
}

Далее вызываем событие:


window.external.Notify("http://developer.alexanderklimov.ru");

Используем индикатор прогресса

Так как загрузка содержимоего из сети может занимать некоторое время, нужно показать пользователю, что программа не зависла, а продолжает работать. Например, можно вывести на экран индикатор прогресса (ProgressBar). Вам нужно установить значение IsIndeterminate в true и показывать и скрывать индикатор в нужное время. Ниже представлен кода на XAML и C#:


<ProgressBar Foreground="Orange" x:Name="ProgBar" 
Visibility="Collapsed" IsIndeterminate="True" Height="4" 
HorizontalAlignment="Left" Margin="10,66,0,0" 
VerticalAlignment="Top" Width="460" />


void Browser_Navigating(object sender, NavigatingEventArgs e)
{
    ProgBar.Visibility = Visibility.Visible;
}
 
void Browser_Navigated(object sender, NavigationEventArgs e)
{
    ProgBar.Visibility = Visibility.Collapsed;
}

Соответственно, когда страница загружается, ProgressBar будет виден, а после загрузки страницы он будет скрыт.

Эффекты в WebBrowser

Важно отметить, что элемент управления WebBrowser в Windows Phone 7, в отличие от своего аналога в десктопном Silverlight не нуждается в HtmlBrush, так как большинство графических преобразований можно сделать над самим браузером. Например, повернём WebBrowser на 45 градусов по оси Y:

 
<phone:WebBrowser 
    HorizontalAlignment="Left" 
    Margin="12,23,0,0" 
    Name="webBrowser1" 
    VerticalAlignment="Top" Width="438" Height="348">
<b>
    <phone:WebBrowser.Projection>
        <PlaneProjection RotationY="-45"/>
    </phone:WebBrowser.Projection></b>
</phone:WebBrowser>

Вот как это будет выглядеть:

При этом элемент WebBrowser полностью интерактивен и продолжает работать как обычно. Во внебраузерном Silverlight 4 приложении мы такое бы сделать не смогли.

Заключение

Сегодня вы познакомились с элементом WebBrowser для навигации по html-страницам. Для лучшего понимания материала, рекомендую скачать исходник и изучить его.

Реклама