Je souhaite héberger un contrôle Silverlight en winforms via un navigateur winforms, mais pour que cela fonctionne, j'ai besoin d'un moyen pour que les formulaires parlent à Silverlight, et inversement. Serait-il possible d'avoir d'une manière ou d'une autre les deux interagissent les uns avec les autres en utilisant JavaScript en tant qu'intermédiaire? C'est-à-dire, que le formulaire parle au javascript du navigateur, et que cela parle au contrôle silverlight? Y a-t-il un meilleur moyen? Ou même un moyen du tout? (autre que la compilation du code sous silverlight et wpf)Silverlight hébergé sous Winforms
Répondre
Je pense que l'utilisation du contrôle Windows Forms WebBrowser est votre meilleur choix. Pour ce faire, vous aurez besoin de votre application Silverlight sur une page Web, puis pointez votre WebBrowser sur l'URI de la page.
Pour garder le contrôle de votre navigateur Web d'agir comme IE, je vous recommande de mettre les éléments suivants:
webBrowser.AllowNavigation = false;
webBrowser.AllowWebBrowserDrop = false;
webBrowser.IsWebBrowserContextMenuEnabled = false;
webBrowser.WebBrowserShortcutsEnabled = false;
méthodes d'appel sur votre formulaire dans Silverlight est assez facile à faire. Pour commencer, vous avez besoin d'une classe qui possède toutes les méthodes que vous voulez appeler depuis Silverlight. Vous pouvez utiliser votre formulaire lui-même ou un autre objet, mais vous devez marquer la classe avec l'attribut [ComVisible (true)]. Vous affectez ensuite votre objet à la propriété WebBrowser.ObjectForScripting. Cela expose votre objet en tant que "window.external" sur la page Web.
[ComVisible(true)]
public partial class Form1 : Form
{
......
webBrowser.ObjectForScripting = this;
......
public void CallMeInForm(string something)
{
MessageBox.Show("Silverlight said: " + something);
}
}
C'est tout pour votre projet Windows Forms. À l'intérieur de votre application Silverlight, vous devez récupérer cette ObjectForScripting et invoquer des méthodes dessus. Pour appeler la méthode dans mon exemple ci-dessus, utilisez les lignes suivantes:
using System.Windows.Browser;
......
ScriptObject myForm = (ScriptObject)HtmlPage.Window.GetProperty("external");
myForm.Invoke("CallMeInForm", "testing 1 2 3");
La commande Invoke vous permet de passer un nombre et le type de paramètres à votre fonction, même si je soupçonne que ce ne serait pas comme beaucoup si vous essayez de faire passer des types de données complexes. Mais si vous deviez le faire, vous pourriez toujours utiliser la sérialisation. L'appel de fonctions Silverlight à partir de votre formulaire semble être le plus délicat. Je n'ai pas encore compris celui-ci.
Dans votre application Silverlight, vous exposez également des fonctions à la page Web. Pour ce faire, utilisez la fonction HtmlPage.RegisterScriptableObject(). Encore une fois, vous pouvez passer dans n'importe quelle classe avec les méthodes que vous souhaitez exposer. Cependant, pour qu'une méthode soit exposée, vous devez la marquer avec l'attribut [ScriptableMember].
HtmlPage.RegisterScriptableObject("Page", this);
......
[ScriptableMember]
public void CallMeInSilverlight(string message)
{
HtmlPage.Window.Alert("The form said: " + message);
}
À ce stade, votre méthode est exposée à JavaScript sur la page et vous pouvez l'appeler comme si, en supposant que vous avez ajouté id="silverlightControl"
à votre élément <object>
:
document.getElementById('silverlightControl').Content.Page.CallMeInSilverlight("testing 1 2 3");
Notez la propriété Page
? Voilà ce que l'appel à RegisterScriptableObject()
nous a donné.Maintenant, nous allons envelopper ceci dans une méthode bien rangé JavaScript:
<script type="text/javascript">
function CallMe(message) {
var control = document.getElementById('silverlightControl');
control.Content.Page.CallMeInSilverlight(message);
}
</script>
Et maintenant, nous pouvons appeler la méthode CallMe()
à partir de Windows Forms application comme ceci:
public void CallToSilverlight()
{
webBrowser.InvokeScript("CallMe", new object[] { "testing 1 2 3" });
}
Silverlight dans une application winform ressemble à de mauvaises nouvelles. Cela signifierait que vous courez à différents CLR dans une seule application et que vous auriez à faire face à beaucoup de complexité pour le faire fonctionner. Si possible, envisagez d'utiliser le WPF complet dans votre application. Voici un link qui vous montre comment.
Le CoreCLR utilisé par Silverlight prend en charge ce scénario de l'exécution en cours avec d'autres RCG, donc ce n'est pas un problème. –
Intéressant, merci du partage. J'essayais de souligner que même si vous pouvez le faire, il n'est peut-être pas conseillé de le faire. Encore une façon élégante de plier la technologie à votre volonté. – smaclell
Umm ... Le CoreCLR sera exécuté sur le client. Il ne fonctionne pas sur le serveur le fait-il? – AnthonyWJones
Jetez un oeil à Desklighter. Pas exactement ce que vous cherchez, mais cela prouve que cela devrait être possible?
Si tout ce que vous vraiment devez faire est l'hôte Silverlight dans une application de bureau, je vous suggère de vérifier le projet SilverlightViewportJeremiah Morrill. Il vous permet d'intégrer une application Silverlight dans une application WPF ou XNA. C'est encore très alpha, mais vous pourriez le trouver utile.
Voici une image pour votre appétit mouiller:
C'est génial! J'espère que vous pouvez comprendre comment le faire fonctionner de WebBrowser à WinForm. Je n'ai vu personne d'autre sur le web faire ça (ou même essayer ...) donc ce serait génial si vous pouviez le comprendre. – NotDan
avez-vous déjà compris comment appeler Silverlight depuis le formulaire hôte? – Shrike