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
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" });
}
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.
CoreCLR używane przez Silverlight obsługuje ten scenariusz uruchomiony w procesie z innymi CLR, więc to nie jest problem. –
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
Umm ... CoreCLR będzie działać na kliencie. Nie działa na serwerze? – AnthonyWJones
Spójrz na Desklighter. Nie dokładnie to, czego szukasz, ale potwierdza, że powinno to być możliwe?
Jeśli wszystko naprawdę trzeba zrobić jest hostem Silverlight w aplikacji na komputer, sugeruję wykonanie projektu Jeremiah Morrill z . Pozwala osadzić aplikację Silverlight w aplikacji WPF lub XNA. Nadal jest bardzo alfa, ale może się przydać.
Oto zdjęcie, aby zwilżyć apetyt:
- 1. Dostawca Sharepoint Hosted User Permissions
- 2. odwoływanie się do asp.net C# classes/methods in silverlight project
- 3. Jak zrobić nieokreślony pasek postępu w WinForms?
- 4. VSTS Hosted Build .Net Framework 4.6.2
- 5. Używanie XAML w WinForms
- 6. 3D w WinForms?
- 7. WinForms: Alternatywa dla SplitContainer?
- 8. Aplikacja WinForms w MonoDevelop
- 9. WinForms forma zamarza
- 10. Oprawa OneWay na WinForms?
- 11. Struktura obiektu WinForms
- 12. WinForms - niewłaściwy rozmiar forma
- 13. C# WinForms ErrorProvider Control
- 14. Wielokrotny wybór na WinForms
- 15. WindowLicker dla WinForms .NET?
- 16. wiąże w WinForms rozwijane
- 17. Przyciski radia WinForms
- 18. Cykl życia WinForms event
- 19. Umieszczanie XNA w WinForms
- 20. Jak poprawić wydajność WinForms MSChart?
- 21. Silverlight SecurityException
- 22. Silverlight DragDrop.DoDragDrop()
- 23. Google CDN Hosted jQuery UI CSS z lokalnym zastępczym?
- 24. Co oznacza "unittest" pakietu z obu źródeł "SDK" i "hosted"?
- 25. Rails 3: Ustawienia SMTP/Hotmail żywo Hosted Email
- 26. Skrót MD5 w silverlight
- 27. C# Problem z WinForms Panel
- 28. Usuń ClickOnce z aplikacji WinForms
- 29. Kontrola vs UserControl w WinForms?
- 30. Wielokolorowy gradient liniowy w WinForms
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
Czy kiedykolwiek odkryłeś, jak nazwać Silverlight z formularza hosta? – Shrike