Я хотел бы разместить элемент управления silverlight в winforms через браузер winforms, но для этого мне нужно каким-то образом формам поговорить с silverlight, а также наоборот. Можно ли каким-то образом взаимодействовать друг с другом, используя JavaScript в качестве посредника? I.e., имеют форму, говорящую с обозревателем javascript, и есть ли это, если говорить с контролем Silverlight? Есть ли способ лучше? Или даже способ вообще? (кроме компиляции кода как silverlight и wpf)
Silverlight, размещенный в Winforms
Ответ 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" });
}
Ответ 2
Посмотрите Desklighter. Не совсем то, что вы ищете, но оно доказывает, что это возможно?
Ответ 3
Если все, что вам действительно нужно сделать, это хост Silverlight в настольном приложении, я предлагаю вам проверить Jeremiah Morrill SilverlightViewport. Он позволяет внедрять приложение Silverlight в приложение WPF или XNA. Он по-прежнему очень альфа, но вы можете найти его полезным.
Вот картинка, чтобы намочить аппетит:
Ответ 4
Silverlight в приложении winform просто звучит как плохая новость. Это означало бы, что вы работаете с разными CLR в одном приложении и должны иметь дело с большой сложностью, чтобы заставить его работать. Если возможно, рассмотрите возможность использования полного WPF в своем приложении, а вот ссылка, показывающая вам, как.