Posts Tagged Projecten

Silverlight 3 Navigatie: Navigeren naar Artikelen in dynamisch geladen assemblees

In mijn laatste bericht over de nieuwe navigatie-functie in Silverlight , heb ik onderzocht hoe je kunt navigeren naar samenstellingen pagina's in / projecten waarnaar wordt verwezen door uw beroep in de hoofdzaak. vrijwel onmiddellijk een aantal van u gevraagd hoe u kunt navigeren naar pagina's in samenstellingen, dat is dynamisch zijn geladen, zodat u onmiddellijk downloaden van bepaalde stukken van uw aanvraag tot en met gebruikers erom vragen. Hiermee kunt u de oorspronkelijke grootte te verminderen (en daarmee belasting / download tijd) van uw verzoek om iets meer geschikt zijn voor uw gebruikers en het gebruik van bandbreedte om componenten te downloaden te voorkomen op de machines van gebruikers dat zij nooit werkelijk gebruiker / ontmoeting.

Uit de doos, Silverlight 3's navigatie-functie laat alleen navigeren naar Pages in samenstellingen waarnaar wordt verwezen door uw project application and verpakt in uw XAP. Er zijn een aantal technische redenen achter dit dat ik know willen we verkennen en hopelijk address in future versies, maar ik zal niet in de details gaan hier. Er is echter een uitzondering op deze regel die ons ervan weerhoudt om te navigeren in de Pages-dynamisch geladen samenstellingen: u can Pages load met no-code achter die leven in dergelijke samenstellingen.

Na een paar maanden van het denken over dit probleem in de rug van mijn geest, het eindelijk geklikt for me: deze uitzondering is de manier! Alle andere workarounds ik kon denken van required Pagina's ligt in het XAP that their zou load inhoud dynamisch en niet echt profiteren van de navigatie-functie op alle.

Anyway, ik denk dat ik eindelijk een redelijk goede oplossing gevonden, en hoewel het een beetje hacky-er dan ik zou hebben gewild, is het niet fundamenteel veranderen het gevoel van het gebruik van Silverlight navigatie. Hier is de kern van mijn strategie:

  • Plaats een samenstel met een dynamisch Page
  • Vermeld in deze vergadering een "shim" Pagina met geen code achter. In haar XAML, verwijzen naar de echte pagina met code achter, en verstrekken alle navigatie-gerelateerde informatie (evenementen, titel, query strings, etc.) naar die pagina
  • Als die pagina wordt genavigeerd, vervang de Frame-inhoud met de echte pagina.
  • Van de aanvraag, navigeer naar de "Shim"-pagina in de dynamisch-assemblage geladen

Ok, ik weet dat klinkt een beetje rotonde, maar ik denk dat ik heb gemaakt tot nu toe vrij gemakkelijk te bereiken voor een ontwikkelaar. Belangrijker nog - het werkt!

Laat me gaan in een iets meer detail ...

De Bibliotheek

Ik heb een heel klein samenstelling die ik heb genoemd "DynamicNavigation". Het bestaat uit twee klassen, die beide zijn gemaakt voor gebruik in XAML:

  • DynamicPage: een afstammeling van de Page klasse die het mogelijk maakt de Shim om te communiceren met haar. Als ik mijn werk goed, voor 99% van de gevallen, kunt u direct navigeren naar deze pagina (in plaats van haar Shim) als je nog niet dynamisch loaded de montage. Er zou eigenlijk niet een nieuwe openbare interface (met uitzondering van enkele "nieuwe" eigenschappen die verbergen de oorspronkelijke pagina-eigenschappen, aangezien zij niet virtueel).
  • DynamicPageShim: Nog een afstammeling van de Page klasse, bedoeld om gebruikt te worden in XAML met geen code achter. Deze klasse zal doen toekomen elke navigatie-evenementen, etc., om de DynamicPage duurt het als de inhoud ervan. Het doel hier was om zoveel mogelijk te beperken, zodat de XAML dat de bijkomende omvang als gevolg van deze bestanden is klein. Er kunnen verdere optimalisaties ik kan doen, maar het is erg dicht in de buurt :)

De Developer Ervaring

Ok, dat is allemaal geweldig, maar wat moet ik doen om het te gebruiken?

Nou, in plaats van 2 bestanden (<PageName>. XAML en <PageName> .xaml.cs / VB), het creëren van een Page neemt nu 3 bestanden:

  • <PageName>. Dyn.xaml:
 : DynamicPageShim xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns : dyn ="clr-namespace:DynamicNavigation;assembly=DynamicNavigation" xmlns : my ="clr-namespace:DynamicallyLoadedLibrary; assembly=DynamicallyLoadedLibrary "> < my : PageName /> </ dyn : DynamicPageShim > <Dyn: DynamicPageShim xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns: dyn = "CLR-namespace: DynamicNavigation; assemblage = DynamicNavigation" xmlns: mijn = "CLR-namespace: DynamicallyLoadedLibrary ; assemblage = DynamicallyLoadedLibrary "> <mijn: PageName /> </ dyn: DynamicPageShim> 

Ik heb twee belangrijke lijnen hier. Ten eerste, "assemblage = DynamicallyLoadedLibrary" - Normaal gesproken is dit onnodig zou zijn onderstreept in een xmlns definitie, want ik kan verwijzen naar de bibliotheek waar de XAML-bestand bestaat zonder de "Vergadering =" syntax. Voor dezelfde technische redenen kunnen we die normaal gesproken niet een Page laden in een dynamisch geladen montage, deze naam moet volledig worden gespecificeerd, aangezien het de XAML loader op zoek naar de dynamisch geladen montage met uw DynamicPage woont. Vervolgens moet je kan zien dat dit een geval van Shim de DynamicPage als de inhoud ervan vindt. Dit maakt het mogelijk om vooruit navigatie-informatie naar de pagina en ervoor te zorgen dat het frame de juiste inhoud heeft.

  • <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-namespace: DynamicNavigation; assemblage = DynamicNavigation" xmlns: navigatie = "CLR-namespace: System.Windows.Controls; assemblage System.Windows.Controls.Navigation =" MC: Ignorable = "d" d: DesignWidth = "640 "d: DesignHeight =" 480 "title =" Titel van de pagina "> <Grid x: Name =" LayoutRoot "> ... </ Grid> </ dyn: DynamicPage> 

Zoals u kunt zien, er is echt niets bijzonders aan de DynamicPage, behalve dat de open / dicht tags zijn van het type DynamicPage in plaats van pagina. Gotta love it!

  • <PageName> .xaml.cs / VB

Ik zal niet hier laten zien een voorbeeld, maar er is echt niets bijzonders over. Je ontwikkelt precies alsof de DynamicPage een echte Page. Het enige wat je voor moet oppassen: doe dan het DynamicPage niet af naar een pagina, aangezien dit ervoor zorgt dat het verwijzen naar de verborgen eigenschappen die niet kunnen worden ingesteld. Nogmaals, voor 99% van de gevallen is dit waarschijnlijk geen probleem, maar het draagt een beetje aandacht.

Het laatste stukje van de puzzel is eigenlijk het navigeren naar de pagina. Nou, het is vrij eenvoudig: navigeer net zoals wij gedaan hebben in mijn andere post (met behulp van "component" pack URI syntaxis). Het enige verschil: in plaats van het navigeren naar <PageName> . XAML, zult u navigeren naar <PageName>. dyn.xaml.

En dat is het! De rest moet gewoon werken!

Dus, zonder verder oponthoud, ik heb een aantal tools voor u!

De Goederen

De download is een zip-boven met 3 dingen:

  1. DynamicNavigation.dll - een samenstel moet je verwijzing in zowel uw aanvraag project (en opgenomen in uw XAP) evenals alle samenstellingen die u wilt dynamisch belasting (zodat u kunt ook de XAML-bestanden hierboven)
  2. DynamicPageCS.zip - dit is een Visual Studio itemsjabloon die u zullen helpen krijg je begon. Drop dit zip (zonder winning) in "<My Documents> \ Visual Studio 2008 \ Templates \ item Templates \ Visual C #." Nu, als je open Visual Studio en een C # Silverlight 3-project, met de rechtermuisknop op het project (in de Solution Explorer) en kies "Add new ...". Selecteer "Silverlight Dynamic Page" en kies een naam voor uw pagina. De itemsjabloon zal leiden naar de 3 archief voor jou. Open "<PageName>. XAML" en begint met het bewerken!
  3. DynamicPageVB.zip - Ik heb u niet vergeten VB guys! Volg dezelfde instructies hierboven (maar het plaatsen van de itemsjabloon in de VB-map in plaats van de C # een), en u moet worden ingesteld om te gaan!

Ik weet zeker dat er een aantal bugs en problemen met wat ik heb gedaan (bijvoorbeeld het item sjablonen niet een verwijzing naar nog DynamicNavigation.dll om uw project ... Ik hoop dit keer vast ik uitzoeken hoe!). Laten het me weten als er iets waardoor je problemen, en ik zal zien of ik het uit kan werken in mijn (niet zo) overvloedige vrije tijd :)

Het Sample

U kent mij - ik kan u niet verlaten zonder een levend voorbeeld van dit ding in actie! Neem een kijkje hier (voor uw kijkplezier):

Geniet! U kunt zelfs een cameo te vinden van een vorige post al!

De tips

Bij het gebruik van mijn DynamicNavigation tools, zijn er een paar dingen die je in gedachten moet houden. Hopelijk krijgt deze lijst kleiner gaan vooruit, maar in de tussentijd, dit zijn enkele dingen om te onthouden:

  • Het is nog steeds aan jou om de vergaderingen dynamisch laden in uw AppDomain voordat aan hen om te navigeren. Een super-eenvoudig voorbeeld van hoe dit te doen kan worden gevonden in de code-behind van mijn MainPage.xaml. U kunt ook gebruik maken van hulpmiddelen zoals Prism soortgelijke iets bereiken. Er zijn zeker enkele trucs die zou dit voelen zich meer on-demand dan wat ik heb gedaan in de steekproef, maar dat is een onderwerp voor een toekomstige post! :)
  • Langs deze lijnen, Zorg ervoor dat alle samenstellingen uw dynamisch geladen is afhankelijk van de montage worden geladen voordat u probeert te navigeren. Ik doe niets om te proberen deze afhankelijkheden op te lossen.
  • Probeer te voorkomen dat uw casting DynamicPage aan haar moedermaatschappij type - pagina. Als je dat doet, vind je enkele eigenschappen zijn niet ingesteld op de gewenste waarden (zoals de titel, NavigationCacheMode, enz.).
  • Mijn bibliotheken frame inhoud te vervangen met de juiste pagina, dus voel je vrij om te binden into Frame.Content net as je anders. U kunt vinden dat Frame.Content does change during twice een menu in plaats van dan een keer, maar anders, zou je dezelfde evenementen / virtuele methoden genaamd / etc. op uw pagina.
  • Verwacht Caching en titel nog steeds naar behoren worden gehonoreerd op uw pagina!
  • Zodra u hebt uw <PageName>. Dyn.xaml bestand, moet je zelden of nooit nodig zijn om deze te wijzigen. Het is gewoon een shim, en alle andere werkzaamheden die u zou willen doen moeten direct mogelijk via de DynamicPage bestanden (. XAML en .xaml.cs / VB)

Ik heb geprobeerd de bibliotheek als klein mogelijk te houden. Alles wat ik voortbouwen op de top van deze, ik ben van plan te brengen in een aparte bibliotheek, zodat je niet gedwongen om extra overhead te nemen voor de eenvoudigste gevallen, waar u al klaar bent met laden en dynamische wil om te navigeren naar pagina's in deze bibliotheken.

De Conclusie

Mijn hoop is dat dit zal u op weg helpen op de weg naar het navigeren naar dynamisch geladen samenstellingen. Ik weet dat het een beetje traag van begrip, en nog moeilijker te maken dan het zou moeten zijn, maar wat ik zou willen doen gaan voorwaarts te nemen deze ontwikkeling en creëer een SL3 bibliotheek die maakt het echt eenvoudig om samenstellingen te downloaden van uw server on-demand tijdens de navigatie (en misschien pas een andere handige functies).

Alsjeblieft, laat me weten wat je ervan vindt. Moet ik meer tijd besteden aan deze dingen? Hoe waardevol is het gebruik van navigatie op deze manier voor u? Welke scenario's zou je nog graag zien ingeschakeld?

Als ik heb verward met de deurklink van je, ik ben oprecht verontschuldigen. Ik weet dat ik merkte dat ik moeite om hierop adequaat te beschrijven, dus alsjeblieft, vragen te stellen! Ik ben blij dat ik mijn gedachten / ervaringen te delen.

Reactie weg!

PS ik ben eindelijk op Twitter (ten minste gedeeltelijk tot mijn ontsteltenis :) ). U kunt me vinden op @ depoll

Update: Julian Biddle heeft gepost een geheel andere strategie die u zou toestaan om XAPs verdeel je Silverlight aanvraag op meerdere op zijn blog: http://anoriginalidea.wordpress.com/2009/07/22/how-to-build-huge- -dynamische cross-platform-Silverlight-business-toepassingen / . Neem een kijkje - het is een interessante lezen / aanpak :)

, , ,

33 reacties