Silverlight, размещенный в Winforms - PullRequest
       22

Silverlight, размещенный в Winforms

11 голосов
/ 13 октября 2008

Я бы хотел разместить элемент управления silverlight в winforms через браузер winforms, но чтобы он работал, мне нужно, чтобы формы общались с silverlight, а также наоборот. Можно ли как-то взаимодействовать между собой, используя JavaScript в качестве посредника? То есть, форма говорит с javascript браузера, и это говорит с контролем Silverlight? Есть ли способ лучше? Или вообще способ вообще? (кроме компиляции кода как silverlight и wpf)

Ответы [ 4 ]

15 голосов
/ 16 октября 2008

Я думаю, что использование элемента управления 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" });
}
1 голос
/ 09 апреля 2010

Если все, что вам действительно нужно, это разместить Silverlight в настольном приложении, я бы посоветовал вам проверить Джереми Моррила SilverlightViewport . Это позволяет встраивать приложение Silverlight в приложение WPF или XNA. Это все еще очень альфа, но вы можете найти это полезным.

Вот картинка, чтобы намочить аппетит:

http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=silverlightviewport&DownloadId=97946

1 голос
/ 14 октября 2008

Посмотрите на Desklighter . Не совсем то, что вы ищете, но это доказывает, что это возможно?

0 голосов
/ 13 октября 2008

Silverlight в приложении winform звучит как плохие новости. Это означало бы, что вы работаете с разными CLR в одном приложении и вам придется иметь дело со множеством дополнительных сложностей, чтобы оно работало. Если возможно, рассмотрите возможность использования полного WPF в своем приложении, вместо этого здесь есть ссылка , показывающая, как.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...