2008-10-13 17 views
11

Chciałbym zorganizować kontrolę silverlight w winformach za pomocą przeglądarki WinForm, ale żeby działała, potrzebuję sposobu, żeby formularze rozmawiały z silverlightem, a także na odwrót. Czy byłoby możliwe, aby te dwie osoby miały ze sobą interakcję, używając JavaScript jako pośrednika? Oznacza to, że formularz powinien odnieść się do javascript przeglądarki i czy powinien on mówić do kontrolki silverlight? Czy istnieje lepszy sposób? A może nawet w ogóle sposób? (inne niż kompilowanie kodu jako silverlight i wpf)Silverlight Hosted in Winforms

Odpowiedz

15

Myślę, że korzystanie z formantów Web Forms WebBrowser jest najlepszym rozwiązaniem. Aby to zrobić, potrzebujesz aplikacji Silverlight na stronie internetowej, a następnie wskaż swój WebBrowser na identyfikatorze URI strony.

Aby utrzymać kontrolę WebBrowser z działając podobnie jak IE, polecam następujące ustawienia:

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

wywoływanie metod na formularzu od wewnątrz Silverlight jest dość łatwe do zrobienia. Aby rozpocząć, potrzebujesz klasy, która ma wszystkie metody, które chcesz wywołać z Silverlight. Możesz użyć samego formularza lub innego obiektu, ale musisz oznaczyć klasę atrybutem [ComVisible (true)]. Następnie przypisujesz swój obiekt do właściwości WebBrowser.ObjectForScripting. To ujawnia twój obiekt jako "window.external" na stronie internetowej.

[ComVisible(true)] 
public partial class Form1 : Form 
{ 
    ...... 
    webBrowser.ObjectForScripting = this; 
    ...... 
    public void CallMeInForm(string something) 
    { 
     MessageBox.Show("Silverlight said: " + something); 
    } 
} 

To wszystko w ramach projektu Windows Forms. Wewnątrz aplikacji Silverlight musisz odebrać obiekt ObjectForScripting i wywołać na nim metody. Aby wywołać metodę w moim przykładzie powyżej, należy wykonać następujące linie:

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

Polecenie Wywołanie pozwala przekazać dowolną liczbę i rodzaj parametrów do funkcji, chociaż podejrzewam, że nie bardzo ją lubię, jeśli spróbuj przekazywać złożone typy danych. Ale jeśli chcesz to zrobić, zawsze możesz skorzystać z serializacji.

Wywoływanie funkcji Silverlight z formularza wydaje się być prostszym kierunkiem. Jeszcze tego nie wymyśliłem.

W aplikacji Silverlight można również wyświetlać funkcje na stronie internetowej. Aby to zrobić, użyj funkcji HtmlPage.RegisterScriptableObject(). Ponownie możesz przekazać dowolną klasę metodami, które chcesz eksponować. Aby metoda była dostępna, musisz oznaczyć ją atrybutem [ScriptableMember].

HtmlPage.RegisterScriptableObject("Page", this); 
...... 
[ScriptableMember] 
public void CallMeInSilverlight(string message) 
{ 
    HtmlPage.Window.Alert("The form said: " + message); 
} 

W tym momencie metoda jest narażona na JavaScript na stronie i można go nazwać jak tak, zakładając, że dodaje id="silverlightControl" do swojego elementu <object>:

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

Zawiadomienie własnością Page? To właśnie dostaliśmy od tego połączenia z RegisterScriptableObject().A teraz owinąć to w uporządkowany sposób javascript:

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

A teraz możemy wywołać metodę z okien CallMe() Forms aplikacji tak:

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

To jest niesamowite! Mam nadzieję, że możesz wymyślić, jak sprawić, by działał od WebBrowser do WinForm. Nie widziałem, żeby ktokolwiek inny w sieci robił to (lub nawet próbował ...), więc byłoby wspaniale, gdybyś mógł to zrozumieć. – NotDan

+0

Czy kiedykolwiek odkryłeś, jak nazwać Silverlight z formularza hosta? – Shrike

0

Silverlight w aplikacji WinForm brzmi jak złe wieści. Oznaczałoby to, że uruchamiasz różne CLR-y w jednej aplikacji i musiałbyś poradzić sobie z dużą złożonością, aby to działało. Jeśli to możliwe, rozważ użycie pełnego WPF w swojej aplikacji, a tutaj jest link pokazujący jak.

+0

CoreCLR używane przez Silverlight obsługuje ten scenariusz uruchomiony w procesie z innymi CLR, więc to nie jest problem. –

+0

Interesujące, dziękuję za udostępnienie. Próbowałem podkreślić, że chociaż możesz to zrobić, może nie być to zalecane. Nadal jest to dobry sposób na zginanie technologii zgodnie z twoją wolą. – smaclell

+0

Umm ... CoreCLR będzie działać na kliencie. Nie działa na serwerze? – AnthonyWJones

1

Spójrz na Desklighter. Nie dokładnie to, czego szukasz, ale potwierdza, że ​​powinno to być możliwe?