Entradas con la etiqueta Proyectos

Silverlight 3 de navegación: Navegación a las páginas en-cargado de forma dinámica las asambleas

En mi último mensaje sobre la nueva función de navegación en Silverlight , exploré cómo se puede navegar a las páginas en las asambleas y proyectos referenciados por la aplicación principal. Casi inmediatamente, algunos de ustedes le preguntó cómo se puede navegar a las páginas en las asambleas que se han dinámicamente cargado, lo que le permite retrasar la descarga de ciertas piezas de su aplicación hasta que los usuarios lo soliciten. Esto le permite reducir el tamaño inicial (y por tanto de carga / tiempo de descarga) de su aplicación a algo más apropiado para sus usuarios y evitar el uso de ancho de banda para descargar componentes a las máquinas de los usuarios que puedan usuario en realidad nunca / encuentro.

Fuera de la caja, la característica de Silverlight 3 de navegación sólo se permite navegar a las páginas en las asambleas que haga referencia el proyecto de aplicación y envasado en su XAP. Hay varias razones detrás de esta técnica, que yo sepa que nos gustaría explorar y esperamos abordar en el futuro versiones, pero no voy a entrar en los detalles aquí. Hay, sin embargo, una excepción a esta regla que nos impide navegar a las páginas en-cargado asambleas dinámicamente: puede cargar páginas con ningún código subyacente que viven en tales asambleas.

Después de unos meses de pensar sobre este problema en el fondo de mi mente, que finalmente hizo clic para mí: esta excepción es la forma en All de las soluciones temporales que era capaz de pensar de páginas situados en el XAP que cargar sus contenidos de forma dinámica y en realidad no se aproveche de la función de navegación en absoluto.

De todos modos, creo que finalmente encontré una solución bastante buena, y aunque es un poco hacky-er que me hubiera gustado, no implica ningún cambio sustancial con la sensación de navegación de Silverlight. Aquí está el quid de mi estrategia:

  • Carga un ensamblado que contiene una página dinámica
  • Incluya en esta asamblea una "corrección" de la página sin código subyacente. En su XAML, referencia a la página real con código subyacente, y les transmitirá toda la información relacionada con la navegación (eventos, título, cadenas de consulta, etc) a esa página
  • Cuando se navega en esa página, sustituir el contenido del marco de la página real.
  • En la aplicación, vaya a la "corrección" de la página en la asamblea de carga dinámica

Ok, ya sé que suena una pequeña rotonda, pero creo que he hecho es bastante fácil de lograr para un desarrollador de ahora. Lo más importante - ¡funciona!

Déjame ir a un poco más de detalle ...

La Biblioteca

He creado un pequeño conjunto poco que he llamado "DynamicNavigation". Contiene dos clases, las cuales están destinadas a utilizarse en XAML:

  • DynamicPage: Un descendiente de la clase Page, que permite la cuña para comunicarse con él. Si yo hice mi trabajo correctamente, el 99% de los casos, usted puede navegar directamente a esta página (en lugar de sus calzas) si no se ha cargado dinámicamente la asamblea. No debería ser ninguna nueva interfaz pública (a excepción de algunas "nuevas" características que esconden el original propiedades de la página, ya que no son virtuales).
  • DynamicPageShim: Otro descendiente de la clase Page, destinada a ser utilizada en XAML sin código subyacente. Esta clase enviará ningún evento de navegación, etc, a la DynamicPage lo toma como su contenido. El objetivo era reducir al mínimo el XAML para que del volumen adicional debido a estos archivos es pequeño. Puede haber más optimizaciones que puedo hacer, pero está muy cerca :)

La experiencia del desarrollador

Ok, eso es todo muy bien, pero ¿qué tengo que hacer para utilizarlo?

Bueno, en lugar de 2 archivos (<PageName>. Xaml y .xaml.cs <PageName> / vb), la creación de una página tiene ahora 3 archivos:

  • <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; montaje = DynamicNavigation" xmlns: mi = "clr-namespace: DynamicallyLoadedLibrary ; Asamblea DynamicallyLoadedLibrary = "> <mi: NombreDePágina /> </ dyn: DynamicPageShim> 

He subrayado dos líneas importantes. En primer lugar, "asamblea = DynamicallyLoadedLibrary" - normalmente, esto sería innecesario en una definición xmlns, ya que puede referirse a la biblioteca en la que el archivo XAML existe sin la asamblea "=" sintaxis. Para las mismas razones técnicas que normalmente no puede cargar una página en una asamblea de carga dinámica, este nombre ha de ser plenamente utilizadas debido a que permite que el cargador de XAML para encontrar el conjunto de carga dinámica en la que reside su DynamicPage. A continuación, puede ver que esta cuña toma una instancia de la DynamicPage como su contenido. Esto permite que transmita la información relacionada con la navegación a la página y garantizar que el marco tiene el contenido correcto.

  • <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; montaje = DynamicNavigation" xmlns navegación = "clr-namespace: System.Windows.Controls; asamblea System.Windows.Controls.Navigation =" mc: ignorable = "d" d: DesignWidth = "640 "d: DesignHeight =" 480 "title =" Portada "> Cuadrícula <x: Nombre =" LayoutRoot "> ... </ Grid> </ dyn: DynamicPage> 

Como puede ver, no hay realmente nada de especial excepto que el DynamicPage de apertura / cierre de etiquetas son de tipo DynamicPage en lugar de la página. Gotta love it!

  • .xaml.cs <PageName> / vb

No voy a mostrar un ejemplo aquí, pero realmente no hay nada especial acerca de esto. Usted desarrollará exactamente como si el fuera un verdadero DynamicPage página. Lo único a tener en cuenta: por favor, no tire la DynamicPage a una página, ya que esto hará que se refieren a propiedades ocultas que no se puede establecer. Una vez más, el 99% de los casos, esto probablemente no es un problema, pero lleva un poco de consideración.

La última pieza del rompecabezas es realmente navegar a la página. Bueno, es bastante sencillo: navegar tal como lo hicimos en mi otro post (usando "componente" paquete de sintaxis URI). La única diferencia: en lugar de navegar hasta <PageName> . xaml, se le vaya a <PageName>. dyn.xaml.

Y eso es todo! El resto sólo debe trabajar!

Así, sin más, tengo algunas herramientas para ti!

El Producto

La descarga de arriba es un zip que contiene 3 cosas:

  1. DynamicNavigation.dll - una reunión, debe hacer referencia tanto en su proyecto de aplicación (e incluya en su XAP), así como los ensamblados que desea cargar de forma dinámica (de modo que usted puede incluir los archivos XAML anterior)
  2. DynamicPageCS.zip - esta es una plantilla de elementos de Visual Studio que le ayudarán a empezar. Drop este zip (sin extraer) en "<Mi Documents> \ Visual Studio 2008 \ Templates \ Plantillas del artículo \ Visual C #". Ahora, si abre Visual Studio y C # Silverlight 3 del proyecto, haga clic en el proyecto (en el explorador de solución) y elegir la opción "Añadir nuevo ...". Seleccione "Silverlight dinámicos de página" y elegir un nombre para tu página. La plantilla de elementos creará los 3 archivos para usted. Abra "<PageName>. xaml" y empezar a editar!
  3. DynamicPageVB.zip - no me olvidé de ti chicos VB! Siga las mismas instrucciones anteriores (pero colocando la plantilla de elementos en la carpeta VB en lugar del C #), ya que deben establecerse para la acción!

Estoy seguro de que hay algunos bugs y problemas con lo que hice (por ejemplo, el tema de plantillas no añadir una referencia a DynamicNavigation.dll a su proyecto aún ... espero solucionar este problema una vez que averiguar cómo!). Deje Quiero saber si algo te está causando problemas, y voy a ver si puedo trabajar en mi (no tan) abundante tiempo libre :)

La Muestra

Usted me conoce - no puedo dejarte sin una muestra viva de esto en acción! Echa un vistazo aquí (para su placer visual):

Disfrute! Usted puede incluso encontrar un cameo de un post anterior en allí!

Los Consejos

Al utilizar mis herramientas DynamicNavigation, hay algunas cosas que usted debe tener en cuenta. Esperemos que esta lista se reducirá en adelante, pero mientras tanto, estas son algunas cosas que recordar:

  • Todavía hasta que cargue los ensamblados de forma dinámica en su dominio de aplicación antes de intentar navegar por ellas. Un ejemplo super simple de cómo hacer esto se pueden encontrar en el código subyacente de mi MainPage.xaml. También puede utilizar herramientas como Prisma para llevar a cabo algo similar. Definitivamente hay algunos trucos que harían que esta se sienta más a la carta que lo que he hecho en la muestra, pero eso es un tema para un futuro post! :)
  • A lo largo de esas líneas, por favor asegúrese de que los ensamblados dinámicamente el ensamblado cargado depende se cargan antes de tratar de navegar. No hacen nada para tratar de resolver las dependencias.
  • Trate de evitar emitir su DynamicPage a su tipo de padres - Página. Si lo hace, usted encontrará algunas propiedades no se establecen a sus valores deseados (por ejemplo, Título, NavigationCacheMode, etc.)
  • Mi bibliotecas deben reemplazar el contenido del marco con la página deseada, así que siéntase libre para unirse en Frame.Content del mismo modo que de otro modo. Es posible que Frame.Content cambia dos veces durante la navegación en lugar de una sola vez, pero por lo demás, usted debe conseguir los mismos hechos o métodos virtual llamado / etc. en su página.
  • Esperar el almacenamiento en caché y el título a seguir siendo honrados correctamente en su página!
  • Una vez que hayas creado tu <PageName>. Dyn.xaml archivo, rara vez se debe, si acaso, necesidad de modificarlo. Es simplemente una cuña, y cualquier otro trabajo que te gustaría hacer en caso de ser posible, directamente a través de la DynamicPage archivos (. xaml y .xaml.cs / vb)

Traté de mantener la biblioteca lo más pequeño posible. Cualquier cosa que construir encima de esto, tengo la intención de poner en una biblioteca independiente, de modo que usted no está obligado a tomar un trabajo adicional para el caso más simple, donde ya ha hecho su carga dinámica y sólo quieren navegar a las páginas de las bibliotecas.

La Conclusión

Mi esperanza es que esto le ayudará a empezar el camino para navegar a las asambleas de carga dinámica. Sé que es un poco obtuso, y aún más difícil de hacer de lo que debiera ser, pero lo que me gustaría hacer aquí en adelante es tomar este desarrollo y crear una biblioteca de SL3 que harán que sea muy simple para descargar las asambleas de su servidor a la carta durante la navegación (y tal vez establecer algunas características ingeniosas otros).

Por favor, hágamelo saber lo que piensas. Debería dedicar más tiempo a estas cosas? ¿Qué valor se utiliza la navegación de este modo a usted? ¿Qué tipo de escenarios le sigue gustando ver activado?

Si he confundido el heck fuera de usted, sinceramente disculpas. Sé que me costaba mucho trabajo para describir esto adecuadamente, así que por favor, hacer preguntas! Estoy feliz de compartir mis pensamientos / experiencias.

Comentario de distancia!

PS Por fin estoy en Twitter (al menos parcialmente, a mi pesar :) ). Me puedes encontrar en la dirección @ depoll

Actualización: Julián Biddle ha publicado una estrategia totalmente diferente que le permite dividir su aplicación de Silverlight en XAPs múltiples en su blog: http://anoriginalidea.wordpress.com/2009/07/22/how-to-build-huge- dinámico-la cruz-plataforma-silverlight-negocio-aplicaciones / . Echa un vistazo - es una lectura interesante y enfoque :)

, , ,

33 Comentarios