davidpoll.com
Entradas con la etiqueta Proyectos
Silverlight 3 de navegación: Navegación a las páginas en-cargado de forma dinámica las asambleas
Publicado por david.poll en Silverlight el 14 de julio 2009
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:
- 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)
- 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!
- 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 ![]()
Personas que conozco
Mensajes recientes
- Para XAML, con amor (un experimento con la serialización XAML en Silverlight)
- Teniendo Microsoft Silverlight 4 aplicaciones más allá del navegador (TechEd WEB313)
- Común de navegación de interfaz de usuario y autorización impulsada por sitemaps
- Las muestras y el código de actualización en los comentarios
- A "refrescante" de autenticación / autorización de experiencia con Silverlight 4
- Hacer más fácil la impresión de Silverlight 4
- Silverlight 4 Fecha de lanzamiento!
- Nuevo en el Silverlight 4 RC: Características XAML
Etiquetas
. NET Servicios RIA Actividad de Control de Autorización de Mezcla BusyIndicator CollectionView ContentLoader controles de enlace de datos dinámicos de navegación Diversión Código Konami tala MIX '10 navegación Off-Topic Fuera del navegador PDC PDC09 Personal Impresión Proyectos relativos Enlaces servidor Silverlight Silverlight 3 Silverlight 3 Beta 4 Silverlight Silverlight 4 Beta de Silverlight 4 RC de Silverlight y más allá (losa) Silverlight Toolkit Mapa del sitio TechEd TechEd de Norteamérica 2010 Aplicaciones de confianza de validación de Visual Studio 2010 Servicios RIA WCF XAML XamlSerializerTwitter: @ depoll
- @ @ ShawnWildermuth jlfergus erik_mork @;) Lo sentimos - sólo repite información. Gracias por pegarme a él, Shawn;) 01 de septiembre 2010 07:12
- @ @ Jlfergus erik_mork @ shawnwildermuth está en la caja de herramientas como el control BusyIndicator 01 de septiembre 2010 07:11
- @ JeffHandley considera usted globalizado. ;) 13 de agosto 2010 08:30
Silverlight Otras entradas del blog - Silverlight y la seguridad de Documentación 03 de septiembre 2010
- Líderes en Silverlight 2 de septiembre 2010
- Nueva RIA Servicios WCF QuickStart 02 de septiembre 2010
Renuncia
El contenido de este sitio representa mis propias opiniones personales y pensamientos en el momento del anuncio, y no reflejan las de mi empleador de ninguna manera.










