2008-10-13 13 views
11

Me gustaría alojar un control silverlight en winforms a través de un navegador de winforms, pero para que funcione necesito alguna forma 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)Silverlight alojado en Winforms

Respuesta

15

Creo que usar el control WebBrowser de Windows Forms es su 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 mantener su control WebBrowser de actuar como IE, me gustaría recomendar el establecimiento de lo siguiente:

webBrowser.AllowNavigation = false; 
webBrowser.AllowWebBrowserDrop = false; 
webBrowser.IsWebBrowserContextMenuEnabled = false; 
webBrowser.WebBrowserShortcutsEnabled = false; 

métodos de llamada en su forma desde dentro Silverlight es bastante fácil 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 el ejemplo anterior, utilice las siguientes líneas:

using System.Windows.Browser; 
...... 
ScriptObject myForm = (ScriptObject)HtmlPage.Window.GetProperty("external"); 
myForm.Invoke("CallMeInForm", "testing 1 2 3"); 

El comando de invocación permite pasar cualquier número y tipo de parámetros a su función, aunque sospecho que no le gustaría mucho si intente pasar tipos de datos complejos alrededor. 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, el método se expone a JavaScript en la página y que se podría llamar como tal, asumiendo que ha añadido a su elemento id="silverlightControl"<object>:

document.getElementById('silverlightControl').Content.Page.CallMeInSilverlight("testing 1 2 3"); 

Aviso Page la propiedad? Eso es lo que nos dio la llamada a RegisterScriptableObject().Ahora, vamos a terminar con esto en una ordenada método 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() del Windows Forms aplicación, así:

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

¡Eso es increíble! Espero que puedas averiguar cómo hacerlo funcionar desde WebBrowser a WinForm. No he visto a nadie más en la web hacer esto (o incluso intentar ...) por lo que sería genial si puedes resolverlo. – NotDan

+0

¿Alguna vez descubrió cómo llamar a Silverlight desde el formulario de host? – Shrike

0

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 link que le muestra cómo hacerlo.

+0

El CoreCLR utilizado por Silverlight es compatible con este escenario de correr en proceso con otros CLR, por lo que este no es un problema. –

+0

Interesante, gracias por compartir. Intentaba enfatizar que, aunque puedes hacerlo, puede que no sea aconsejable hacerlo. Sigue siendo una buena manera de doblar la tecnología a tu voluntad. – smaclell

+0

Umm ... El CoreCLR se ejecutará en el cliente. No se ejecuta en el servidor, ¿verdad? – AnthonyWJones

1

Eche un vistazo a Desklighter. ¿No es exactamente lo que estás buscando pero es una prueba de que debería ser posible?