Ответ 1
Я думаю, что использование элемента управления Windows Forms WebBrowser - ваш лучший выбор. Для этого вам понадобится приложение Silverlight на веб-странице, затем вы укажете свой WebBrowser на URI страницы.
Чтобы ваш элемент управления WebBrowser работал как 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" });
}