Написание сценариев для веб-страницы с помощью .NET
32WPF --- Элементы управления WPF --- Написание сценариев для веб-страницы с помощью .NET
Последний прием с элементом управления WebBrowser, который будет показан, представляет нечто более интригующее — возможность реагировать на события веб-страницы в своем коде Windows.
Элемент управления WebBrowser существенно упрощает решение этой задачи. Первым шагом является создание класса, который будет получать сообщения от кода JavaScript. Чтобы этот класс мог работать со сценариями, в его объявление должен быть обязательно добавлен атрибут ComVisible (из пространства имен System.Runtime.InteropServices):
[ComVisible(true)]
public class HtmlBridge
{
public void WebClick(string source)
{
MessageBox.Show("Received: " + source);
}
}
Далее необходимо зарегистрировать экземпляр этого класса с WebBrowser. Делается это путем установки свойства WebBrowser.ObjectForScripting:
public MainWindow()
{
InitializeComponent();
webBrowser.Navigate("file:///" + System.IO.Path.Combine(Path.GetDirectoryName(Application.ResourceAssembly.Location),
"sample.htm"));
webBrowser.ObjectForScripting = new Html Bridge();
}
Теперь демонстрационная веб-страница HTML сможет вызывать любой общедоступный метод класса HtmlBridge, в том числе HtmlBridge.WebClick(). Внутри веб-страницы используется код JavaScript для инициирования события.
Трюк кроется в объекте window.external, который представляет связанный объект .NET. С помощью этого объекта указывается метод, который должен вызываться; например, для вызова общедоступного метода по имени HelloWorld в объекте .NET используемый синтаксис должен выглядеть как window.external.HelloWorld().
При использовании JavaScript для инициирования события из веб-страницы, удостоверьтесь, что класс не содержит общедоступных методов, которые не имеют отношения к вебдоступу. Теоретически злоумышленник может найти исходный код HTML и изменить его, вызвав какой-то другой метод, отличный от того, который был предусмотрен разработчиком. В идеале для обеспечения безопасности в классе, способном работать со сценариями, должны содержаться только методы, имеющие отношение к веб-доступу.
Для встраивания команды JavaScript в веб-страницу сначала необходимо выбрать, на какое событие веб-страницы реагировать. Большинство HTML-элементов поддерживает относительно немного событий, наиболее полезные из которых описаны ниже:
Событие onFocus, которое происходит при получении элементом управления фокуса
Событие onBlur, которое происходит при перемещении фокуса с элемента управления
Событие onClick, которое происходит при выполнении пользователем щелчка на элементе управления
Событие onChange, которое происходит при изменении пользователем значения определенных элементов управления
Событие onMouseOver, которое происходит при наведении пользователем указателя мыши поверх элемента управления.
Для написания команды JavaScript, способной реагировать на одно из этих событий, необходимо добавить атрибут с таким именем к дескриптору элемента. Например, если есть следующий дескриптор изображения:
<img border="0" id="imgl" src="buttonC.jpg" height="20" width="100">
можно добавить атрибут onClick, который обеспечит вызов метода HelloWorld() в связанном классе .NET при каждом выполнении щелчка на этом изображении.
На рисунке ниже показано приложение, которое объединяет в себе все описанные выше аспекты. В этом приложении элемент управления WebBrowser отображает локальный HTML-файл, содержащий четыре кнопки, каждая из которых представляет собой графическое изображение. Но когда пользователь щелкает на кнопке, изображение использует атрибут onClick для запуска метода HtmlBridge.WebClick():