Silverlight托管在Winforms中

本文关键字:Winforms Silverlight | 更新日期: 2023-09-27 17:48:49

我想通过winforms浏览器在winforms中托管一个silverlight控件,但要使其工作,我需要某种方式让表单与silverlight对话,也需要另一种方式。有可能让两者以某种方式使用JavaScript作为中间人进行交互吗?也就是说,让表单与浏览器的javascript对话,让它与silverlight控件对话?有更好的方法吗?甚至是一种方式?(除了将代码编译为silverlight和wpf之外)

Silverlight托管在Winforms中

我认为使用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窗体项目内部的内容。在你的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()的调用

<script type="text/javascript">
    function CallMe(message) {
        var control = document.getElementById('silverlightControl');
        control.Content.Page.CallMeInSilverlight(message);
    }
</script>

现在我们可以从Windows窗体应用程序中调用CallMe()方法,如下所示:

public void CallToSilverlight()
{
    webBrowser.InvokeScript("CallMe", new object[] { "testing 1 2 3" });
}

看看Desklighter。不完全是你想要的,但它确实证明了这是可能的?

如果您真正需要做的只是在桌面应用程序中托管Silverlight,我建议您查看Jeremiah Morrill的SilverlightViewport项目。它允许您在WPF或XNA应用程序中嵌入Silverlight应用程序。它仍然非常阿尔法,但你可能会发现它很有用。

这是一张让你胃口大开的照片:

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

在winform应用程序中安装Silverlight听起来像个坏消息。这意味着你在一个应用程序中运行不同的CLR,并且必须处理大量增加的复杂性才能使其工作。如果可能的话,可以考虑在你的应用程序中使用完整的WPF,这里有一个链接向你展示了如何使用。