c# - dotnetbrowser - chromium.net control
Silverlight alojado en Winforms (4)
Silverlight en una aplicación winform solo suena como una mala noticia. Significaría que está ejecutando diferentes CLR en una sola aplicación y que tendría que lidiar con una gran complejidad para que funcione. Si es posible, considere usar el WPF completo dentro de su aplicación; aquí hay un enlace que le muestra cómo hacerlo.
Me gustaría alojar un control Silverlight en winforms a través de un navegador de winforms, pero para que funcione, necesito algún modo para que los formularios hablen con Silverlight, y también al revés. ¿Sería posible hacer que los dos interactúen entre ellos usando JavaScript como intermediarios? Es decir, ¿tiene el formulario para hablar con el Javascript del navegador, y tiene que hablar con el control Silverlight? ¿Hay una mejor manera? O incluso una forma en absoluto? (aparte de compilar el código como Silverlight y wpf)
Eche un vistazo al Desklighter . ¿No es exactamente lo que estás buscando pero es una prueba de que debería ser posible?
Si todo lo que necesita hacer es alojar Silverlight en una aplicación de escritorio, le sugiero que consulte el proyecto SilverlightViewport de Jeremiah Morrill . Le permite incrustar una aplicación Silverlight en una aplicación WPF o XNA. Todavía es muy alfa, pero puede que le resulte útil.
Aquí hay una foto para humedecer su apetito:
Creo que usar el control WebBrowser de Windows Forms es tu mejor opción. Para hacer esto, necesitará su aplicación Silverlight en una página web, luego apunte su WebBrowser al URI de la página.
Para evitar que su control WebBrowser actúe como IE, recomiendo configurar lo siguiente:
webBrowser.AllowNavigation = false;
webBrowser.AllowWebBrowserDrop = false;
webBrowser.IsWebBrowserContextMenuEnabled = false;
webBrowser.WebBrowserShortcutsEnabled = false;
Los métodos de llamada en su formulario desde Silverlight son bastante fáciles de hacer. Para empezar, necesitas una clase que tenga todos los métodos a los que quieras llamar desde Silverlight. Puede usar su formulario u otro objeto, pero debe marcar la clase con el atributo [ComVisible (true)]. Luego asigna su objeto a la propiedad WebBrowser.ObjectForScripting. Esto expone su objeto como "window.external" en la página web.
[ComVisible(true)]
public partial class Form1 : Form
{
......
webBrowser.ObjectForScripting = this;
......
public void CallMeInForm(string something)
{
MessageBox.Show("Silverlight said: " + something);
}
}
Eso es todo dentro de su proyecto Windows Forms. Dentro de su aplicación Silverlight, necesita recoger este ObjectForScripting e invocar métodos en él. Para llamar al método en mi ejemplo anterior, use las siguientes líneas:
using System.Windows.Browser;
......
ScriptObject myForm = (ScriptObject)HtmlPage.Window.GetProperty("external");
myForm.Invoke("CallMeInForm", "testing 1 2 3");
El comando Invocar le permite pasar cualquier número y tipo de parámetros a su función, aunque sospecho que no le gustaría mucho si intenta pasar tipos de datos complejos. Pero si necesita hacerlo, siempre puede usar la serialización.
Llamar a las funciones de Silverlight desde su formulario parece ser la dirección del tricker. Aún no lo he descifrado por completo.
En su aplicación Silverlight, también expone las funciones a la página web. Para hacer esto, use la función HtmlPage.RegisterScriptableObject (). Nuevamente, puede pasar en cualquier clase con los métodos que quiera exponer. Sin embargo, para que un método quede expuesto, debe marcarlo con el atributo [ScriptableMember].
HtmlPage.RegisterScriptableObject("Page", this);
......
[ScriptableMember]
public void CallMeInSilverlight(string message)
{
HtmlPage.Window.Alert("The form said: " + message);
}
En este punto, su método está expuesto a JavaScript en la página y podría llamarlo así, suponiendo que haya agregado id="silverlightControl"
a su elemento <object>
:
document.getElementById(''silverlightControl'').Content.Page.CallMeInSilverlight("testing 1 2 3");
Observe la propiedad de la Page
? Eso es lo que nos dio la llamada a RegisterScriptableObject()
. Ahora, envolvemos esto en un método ordenado de JavaScript:
<script type="text/javascript">
function CallMe(message) {
var control = document.getElementById(''silverlightControl'');
control.Content.Page.CallMeInSilverlight(message);
}
</script>
Y ahora podemos llamar al método CallMe()
desde la aplicación Windows Forms así:
public void CallToSilverlight()
{
webBrowser.InvokeScript("CallMe", new object[] { "testing 1 2 3" });
}