Silverlight托管在Winforms中
本文关键字:Winforms Silverlight | 更新日期: 2023-09-27 17:48:49
我想通过winforms浏览器在winforms中托管一个silverlight控件,但要使其工作,我需要某种方式让表单与silverlight对话,也需要另一种方式。有可能让两者以某种方式使用JavaScript作为中间人进行交互吗?也就是说,让表单与浏览器的javascript对话,让它与silverlight控件对话?有更好的方法吗?甚至是一种方式?(除了将代码编译为silverlight和wpf之外)
我认为使用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,这里有一个链接向你展示了如何使用。