Posty oznaczone Projekty

Silverlight 3 nawigacji: Nawigacja do stron zespołów w fazie dynamicznego

W moim ostatnim postem na nową funkcję nawigacji w Silverlight , I sprawdzali, jak można przejść do strony z zespołów / projektów, do których odwołuje się główne zastosowanie. Prawie natychmiast, kilka z was pytanie, jak można przejść do strony z zespołów, które dynamicznie załadowane, co pozwala na opóźnienie pobierania niektórych części aplikacji do użytkowników na ich wniosek. Pozwala to na zmniejszenie rozmiaru początkowego (a tym samym obciążenie / czas pobrania) w aplikacji na bardziej odpowiednie dla użytkowników i unikać części pasma do pobrania do maszyn użytkowników, że mogą one nigdy faktycznie user / spotkania.

Po wyjęciu z pudełka, posiadają Silverlight 3 nawigacji pozwala tylko na nawigację Strony w zespoły do których odwołuje się projekt wniosku oraz pakowane w XAP. Istnieje wiele powodów technicznych, za to, że wiem, chcielibyśmy zbadać adres i miejmy nadzieję, w przyszłości wersje, ale nie będę wchodził w szczegóły tutaj. Istnieje jednak jeden wyjątek od tej reguły, że nie pozwala nam nawigację do stron zespołów w fazie dynamicznego: można załadować Strony bez kodu za które żyją w takich zgromadzeń.

Po kilku miesiącach myślenia o tym problemie w plecy mojego umysłu, to w końcu kliknięciu dla mnie: tego wyjątku jest sposób! Wszystkie inne obejścia byłem w stanie myśleć o wymagane stron znajduje się w XAP, że ich obciążenia zawartość dynamicznie i tak naprawdę nie korzystać z funkcji nawigacji w ogóle.

Tak, myślę, że w końcu znalazłem dość dobry obejście, a jednocześnie trochę Hacky-er niż podoba mi się, nie zmienia w sposób zasadniczy styl za pomocą nawigacji Silverlight. Oto sedno mojej strategii:

  • Obciążenia zespołu zawierający strony dynamicznie
  • Zawierają w tym zgromadzeniu "podkładki" Page bez kodu tyle. W XAML, odniesienie rzeczywistego stronę z kodem w tyle, i przekazać wszelkie informacje związane z nawigacji (wydarzenia, tytuł, zapytanie smyczki, itp.), że strona
  • Gdy strona jest nawigacja do zastąpienia zawartości ramki z prawdziwej strony.
  • Z aplikacji, przejdź do "podkładki", strona w zespole dynamicznie załadowany

Ok, wiem, że brzmi to małe rondo, ale myślę, że zrobiłem to całkiem łatwe do osiągnięcia dla deweloperów teraz. Co ważniejsze - to działa!

Pozwól mi odejść do nieco bardziej szczegółowo ...

Biblioteka

Utworzona malutkie, że mam zespół o nazwie "DynamicNavigation". Zawiera dwie klasy, z których oba są do stosowania w XAML:

  • DynamicPage: potomek klasy Page Shim, który pozwala komunikować się z nim. Gdybym nie moje zadanie poprawnie, dla 99% przypadków, można przejść bezpośrednio do tej strony (a nie jego Shim), jeśli nie załadowane dynamicznie zespołu. Nie powinno być naprawdę nowych interfejsu publicznego (z wyjątkiem niektórych "nowych" właściwości ukryć oryginalny właściwości strony, ponieważ nie są wirtualne).
  • DynamicPageShim: Kolejny potomek klasy Page, przeznaczone do stosowania w XAML bez kodu tyle. Klasa ta przekazuje żadnych wydarzeń nawigacji itp., do DynamicPage zajmuje w jej treści. Naszym celem było zminimalizowanie XAML, tak aby dodatkowej wielkości ze względu na tych plików jest niewielka. mogą nastąpić kolejne optymalizacje mogę zrobić, ale to całkiem bliski :)

Developer Doświadczenie

Ok, to wszystko świetnie, ale co mogę zrobić, aby go używać?

Cóż, zamiast 2 plików (<PageName>. XAML i <PageName> .xaml.cs / vb), tworzenia stron trwa teraz 3 pliki:

  • <PageName>. Dyn.xaml:
  : DynamicPageShim xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" <Dyn: DynamicPageShim xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
             dyn ="clr-namespace:DynamicNavigation;assembly=DynamicNavigation" xmlns: dyn = "clr-przestrzeni nazw: DynamicNavigation; montaż = DynamicNavigation" 
             my ="clr-namespace:DynamicallyLoadedLibrary; assembly=DynamicallyLoadedLibrary "> xmlns: my = "clr-przestrzeni nazw: DynamicallyLoadedLibrary; montaż = DynamicallyLoadedLibrary"> 
      : PageName /> <My: nazwa strony /> 
  : DynamicPageShim > </ Dyn: DynamicPageShim> 

Mam podkreślić dwie ważne linie tutaj. Po pierwsze, "zespół = DynamicallyLoadedLibrary" - zwykle będzie to konieczne w definicji xmlns, gdyż mogę odwołać się do biblioteki, w których istnieje plik XAML bez "montaż =" składni. Przypadku tym samym z przyczyn technicznych, których zazwyczaj nie można załadować strony w zespole dynamicznie ładowane, nazwa ta musi być w pełni określony, ponieważ pozwala na XAML ładowarka znaleźć załadowane dynamicznie swój zespół, w którym zamieszkuje DynamicPage. Następnie należy widać, że ma Shim wystąpienie DynamicPage w jej treści. Pozwala ona do przekazania informacji dotyczących nawigacji do strony i zapewnienia, że ramka ma poprawną treść.

  • <PageName>. XAML
 : DynamicPage x : Class ="DynamicallyLoadedLibrary.CSDynamicPage" xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns : x ="http://schemas.microsoft.com/winfx/2006/xaml" xmlns : d ="http://schemas.microsoft.com/expression/blend/2008" xmlns : mc ="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns : dyn ="clr-namespace:DynamicNavigation;assembly=DynamicNavigation" xmlns : navigation ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" mc : Ignorable ="d" d : DesignWidth ="640" d : DesignHeight ="480" Title ="Page Title"> < Grid x : Name ="LayoutRoot"> ... </ Grid > </ dyn : DynamicPage > <Dyn: DynamicPage x: Class = "DynamicallyLoadedLibrary.CSDynamicPage" xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns: x = "http://schemas.microsoft.com/winfx / 2006/xaml "xmlns: d =" http://schemas.microsoft.com/expression/blend/2008 "xmlns: mc =" http://schemas.openxmlformats.org/markup-compatibility/2006 "xmlns: dyn = "clr-przestrzeni nazw: DynamicNavigation; montaż = DynamicNavigation" xmlns: nawigacji = "clr-przestrzeni nazw: System.Windows.Controls; montaż = System.Windows.Controls.Navigation" mc: Ignorable = "d" d: DesignWidth = "640 "d: DesignHeight =" 480 "title =" Tytuł strony "> Grid <x: Name =" LayoutRoot "> ... </ Grid> </ dyn: DynamicPage> 

Jak widać, nie ma naprawdę nic szczególnego w DynamicPage wyjątkiem tego, że otwarcie / zamknięcie tagi są DynamicPage typu, a nie strony. Gotta love it!

  • <PageName> .xaml.cs / Vb

Nie pokażę przykład tutaj, ale naprawdę nic specjalnego na ten temat. Będziesz rozwijać dokładnie tak, jak gdyby były prawdziwe DynamicPage strony. Jedyną rzeczą, na które trzeba uważać: proszę nie rzucać DynamicPage do strony ponieważ spowoduje to odnieść się do ukrytych właściwości, które mogą nie zostać ustalone. Ponownie, dla 99% przypadków, to prawdopodobnie nie jest problem, ale posiada trochę szacunku.

Ostatni element układanki jest faktycznie przechodząc na stronie. Cóż, to bardzo proste: po prostu poruszać się tak jak to było w moim innego stanowiska (za pomocą "część" pakietu składni URI). Jedyną różnicą: zamiast nawigację <PageName> . XAML, musisz przejść do <PageName>. dyn.xaml.

I to jest to! Reszta powinna po prostu działa!

Tak więc, bez dalszego nagłaśniania, mam jakieś narzędzia dla Ciebie!

Towar

Download powyżej zip zawierający 3 rzeczy:

  1. DynamicNavigation.dll - zespół należy odniesienie zarówno projektu wniosku (i to w xap), jak również żadnych zespołów, który chcesz załadować dynamicznie (tak, aby można dołączyć pliki XAML powyżej)
  2. DynamicPageCS.zip - jest to Visual Studio szablonu elementów, które pomogą Ci zacząć. Usunąć ten zip (bez ekstrakcji) w "<usługa> Documents> \ Visual Studio 2008 \ Templates \ przedmiotu Templates \ Visual C #". Teraz, po otwarciu Visual Studio oraz C # Silverlight 3 projektu, kliknij prawym przyciskiem myszy projektu (w Solution Explorer) i wybierz "Dodaj ...". Wybierz "Silverlight Dynamic Page" i wybrać nazwę dla swojej strony. szablonu elementów stworzy 3 plików dla Ciebie. Otwórz "<PageName>. XAML" i rozpocząć edycję!
  3. DynamicPageVB.zip - Nie zapominamy o Was VB! Postępuj zgodnie z instrukcjami powyżej sam (ale wprowadzenie elementu szablonu w folderze zamiast VB C # jeden), a powinno być ustawione na start!

Jestem pewien, że jest kilka błędów i problemów z tym, co zrobiłem (na przykład pozycja szablony nie dodać odwołanie do DynamicNavigation.dll do projektu jeszcze ... Mam nadzieję, że w celu rozwiązania tego kiedyś dowiedzieć się, jak!). Let mi znać, jeśli coś jest przyczyną masz problemy, a ja zobaczę, czy uda mi się dogadać w mojej (nie) dużą ilością wolnego czasu :)

Sample

Znasz mnie - nie mogę zostawić cię bez próby na żywo to coś w akcji! Spójrz tutaj (do oglądania):

Enjoy! Można nawet znaleźć kamea z poprzedniego postu w tam!

Porady

Podczas korzystania z moich narzędzi DynamicNavigation, istnieje kilka rzeczy, które warto pamiętać. Mam nadzieję, że lista będzie coraz mniejsze idąc dalej, ale w międzyczasie, to są pewne rzeczy do zapamiętania:

  • To jeszcze do załadowania zestawów dynamicznie na swoje AppDomain przed przystąpieniem do nawigacji do nich. Super-prosty przykład, jak to zrobić można znaleźć w kodzie, za moich MainPage.xaml. Możesz również użyć narzędzia, takie jak pryzmat coś osiągnąć podobne. Istnieje kilka sztuczek, które z pewnością pozwoliłoby to czują się bardziej niż na żądanie, co zrobiłem do próby, ale to temat na przyszłość post! :)
  • W tym kierunku, upewnij się, żadnych zespołów Twoje dynamicznie ładowane montażu zależy są ładowane, zanim do nawigacji. Nie robię nic, aby rozwiązać te zależności.
  • Staraj się unikać oddawania DynamicPage do jego rodzica typu - Page. Jeśli tak, znajdziesz niektóre nieruchomości nie są ustawione na żądane wartości (takie jak tytuł, NavigationCacheMode, itp.).
  • My bibliotek powinny zastąpić Zawartość ramki z planowanym stronie, dlatego zachęcamy do wiązania w Frame.Content tak samo jak w inny sposób. Może się okazać, że Frame.Content nie zmienia dwa razy w nawigacji, a nie tylko raz, ale inaczej, powinieneś dostać te same wydarzenia / wirtualne metody / etc. na stronie.
  • Tytuł buforowanie i oczekiwać na jeszcze odpowiednio honorowane na Twojej stronie!
  • Po utworzeniu <PageName>. Dyn.xaml pliku, należy rzadko, jeśli w ogóle, trzeba go zmienić. To tylko podkładki, oraz wszelkie inne prace, które chcesz zrobić powinno być możliwe bezpośrednio przez DynamicPage plików (. XAML i .xaml.cs / vb)

Starałem się zachować w bibliotece jak najmniejsza. Wszystko mogę zbudować na tej bazie, zamierzam się w osobnej bibliotece, dzięki czemu nie jesteśmy zmuszeni do podjęcia dodatkowych kosztów stałych w najprostszych przypadkach, gdy jesteś już zrobić swoje dynamiczne ładowanie i po prostu chcą, aby przejść do strony z tych bibliotek.

Wnioski

Mam nadzieję, że będzie to dobry początek drogi w dół przechodząc do zespołów dynamicznie załadowany. Wiem, że to nieco tępy, a jeszcze trudniejsze do zrobienia, niż być powinno, ale to, co chciałbym zrobić koniunktury można podjąć tego rozwoju i tworzenia SL3 biblioteki, które będą stanowić bardzo proste zestawy do pobierania z serwera na żądanie podczas nawigacji (i być może opracować inne ładne rysy twarzy).

Proszę, daj mi znać, co myślisz. Powinienem poświęcić więcej czasu na te rzeczy? Jak cenne jest przy pomocy nawigacji w ten sposób do ciebie? Jakie scenariusze Czy nadal chcesz zobaczyć aktywny?

Jakbym pomyliła zielonego z was szczerze przeprosić. Wiem, że znalazłem się stara się opisać tego dokonać, dlatego należy zadawać pytania Jestem szczęśliwy podzielić się myślami / doświadczenia.

Komentarz daleko!

PS Jestem w końcu na Twitter (przynajmniej częściowo na moje przerażenie :) ). Znajdziesz mnie na @ depoll

Aktualizacja: Julian Biddle opublikował całkowicie innej strategii, które pozwalają dzielić aplikacji Silverlight w wielu XAPs na swoim blogu: http://anoriginalidea.wordpress.com/2009/07/22/how-to-build-huge- dynamic-cross-platform-Silverlight-business-applications / . Rozejrzyj się - to ciekawe brzmienie / podejścia :)

, , ,

33 Komentarze