Я думаю, что использование элемента управления Windows Forms WebBrowser - ваш лучший выбор. Для этого вам понадобится приложение Silverlight на веб-странице, а затем укажите веб-браузеру на URI страницы.
Чтобы ваш веб-браузер не работал как IE, я бы рекомендовал установить следующее:
webBrowser.AllowNavigation = false;
webBrowser.AllowWebBrowserDrop = false;
webBrowser.IsWebBrowserContextMenuEnabled = false;
webBrowser.WebBrowserShortcutsEnabled = false;
Вызов методов в вашей форме из Silverlight достаточно прост. Для начала вам нужен класс, в котором есть все методы, которые вы хотите вызвать из Silverlight. Вы можете использовать свою форму или другой объект, но вам нужно пометить класс атрибутом [ComVisible (true)]. Затем вы присваиваете свой объект свойству WebBrowser.ObjectForScripting. Это выставляет ваш объект как "window.external" на веб-странице.
[ComVisible(true)]
public partial class Form1 : Form
{
......
webBrowser.ObjectForScripting = this;
......
public void CallMeInForm(string something)
{
MessageBox.Show("Silverlight said: " + something);
}
}
Вот и все для вашего проекта Windows Forms. Внутри вашего приложения Silverlight вам нужно выбрать этот ObjectForScripting и вызвать для него методы. Чтобы вызвать метод в моем примере выше, используйте следующие строки:
using System.Windows.Browser;
......
ScriptObject myForm = (ScriptObject)HtmlPage.Window.GetProperty("external");
myForm.Invoke("CallMeInForm", "testing 1 2 3");
Команда Invoke позволяет передавать любое количество и тип параметров в вашу функцию, хотя я подозреваю, что это не очень понравится, если вы попытаетесь передать сложные типы данных. Но если вам нужно это сделать, вы всегда можете использовать сериализацию.
Вызов функций Silverlight из вашей формы кажется хитрым направлением. Я еще не понял этого полностью.
В приложении Silverlight вы также предоставляете функции веб-странице. Для этого используйте функцию HtmlPage.RegisterScriptableObject (). Опять же, вы можете передать в любой класс методы, которые вы хотите выставить. Для того чтобы метод был доступен, вы должны пометить его атрибутом [ScriptableMember].
HtmlPage.RegisterScriptableObject("Page", this);
......
[ScriptableMember]
public void CallMeInSilverlight(string message)
{
HtmlPage.Window.Alert("The form said: " + message);
}
На этом этапе ваш метод подвергается воздействию JavaScript на странице, и вы можете назвать его так, предполагая, что вы добавили id="silverlightControl"
к элементу <object>
:
document.getElementById('silverlightControl').Content.Page.CallMeInSilverlight("testing 1 2 3");
Обратите внимание на свойство Page
? Вот что нам позвонил RegisterScriptableObject()
. Теперь давайте обернем это в аккуратный метод JavaScript:
<script type="text/javascript">
function CallMe(message) {
var control = document.getElementById('silverlightControl');
control.Content.Page.CallMeInSilverlight(message);
}
</script>
И теперь мы можем вызвать метод CallMe()
из приложения Windows Forms следующим образом:
public void CallToSilverlight()
{
webBrowser.InvokeScript("CallMe", new object[] { "testing 1 2 3" });
}