2008-12-01 18 views
6

¿Es posible implementar una aplicación de Windows WPF de forma que los archivos xaml puedan manipularse en tiempo de ejecución? Si es posible, me imagino que esto funcionaría de manera similar a una aplicación asp.net que puede implementar las páginas .aspx como contenido, que luego se compilan justo a tiempo en el tiempo de ejecución.¿Se puede implementar una aplicación wpf sin compilar el xaml?

Me gustaría permitir que el diseño simple de una pantalla se edite en tiempo de ejecución editando el XAML. ¿Alguien sabe si esto es posible?

Edit: Cuando me refiero a los archivos xaml, me refiero al xaml correspondiente a mis clases UIElement. En otras palabras, he definido clases UserControl usando Xaml y código subyacente, herencia, controladores de eventos, referencias de ensamblado, etc. Cuando llega el momento de la implementación, me gustaría poder mantener la funcionalidad de código subyacente pero aún así permitir el xaml para ser editado

Respuesta

6

tengo otra sugerencia para usted - la verdadera pregunta era:

"Me gustaría para permitir la sencilla disposición de una pantalla para editar en Run- tiempo editando el XAML. ¿Alguien sabe si esto es posible?

¡La respuesta es definitivamente "SÍ"! Y hay muchas formas de lograrlo, por supuesto, haciendo algunas suposiciones.

Si no tiene necesidad de manejar eventos o escribir convertidores de valores personalizados (o cualquier otra cosa que normalmente iría en el código) en la parte "dinámica" de su XAML, simplemente puede usar la clase XamlReader para analizar un archivo XAML o una cadena que contiene XAML. Como solo está editando el diseño, espero que estas suposiciones sean ciertas.

lo tanto, aquí es lo que haría:

1) todos los controles personalizados, modelos de datos, convertidores de valores, etc, y pegarlas en una asamblea.

2) Cargue ese ensamblaje, ya sea haciendo que su aplicación lo referencia o lo cargue dinámicamente; ambos funcionarán.

3) Cree una cadena/archivo/recurso (elija) que tenga su XAML que hace el diseño, complete con el mapeo de su espacio de nombres .NET en un espacio de nombres XML. ¡Asegúrese de no tener un atributo "x: Clase" en el elemento raíz ya que no tiene código detrás del archivo! La cadena usaría los controles WPF estándar (como el StackPanel) para diseñar sus controles personalizados. (Por supuesto, también puede escribir controles de diseño personalizados).

4) Permita que el usuario edite esta cadena. Cuando lo hayan editado, use el XamlReader para analizar el archivo y luego muestre el UIElement resultante en su ventana.

BINGO!

Un problema: cada vez que se cambia el XAML, se lanza la GUI y se crea una nueva. Si su GUI es segura (incluso si la posición actual de intercalación es importante), el usuario se molestará bastante rápido. Depende de cuál sea su intención de uso; esto puede no ser un problema.

Espero que con algo más de trabajo, podría escribir una ampliación de marca que se utiliza para referirse a las partes que está tratando de diseñar. De esta forma, podrían reutilizarse cuando cambie el diseño.

Espero que esto esté claro. Si no, avíseme y puedo ampliar el concepto, sería una buena entrada de blog.

+0

esta es una visión útil. Tengo que investigar un poco para determinar si esto es lo que debo hacer. – YeahStu

+0

Me complace ayudar aún más si el enfoque suena como lo que quiere hacer, pero no puedo lograr que WPF muestre buenos modales. daniel.paull en thinkbottomup.com.au si necesita contactarme. Cheers, Dan. –

5

No es fácil. Una aplicación WPF tiene su XAML traducido en .g.cs y .baml por el compilador, y posteriormente se compila en el binario.

Ciertamente, es posible crear un compilador XAML en tiempo de ejecución. Esta no sería una tarea fácil, y realmente requeriría un poco de reflexión sobre por qué no solo hacer esto como un sitio web.

1

Puede cargar XAML a la aplicación en tiempo de ejecución como a continuación.

UIElement documentRoot = (UIElement)System.Windows.Markup.XamlReader.Load(xmlReader); 

hay un concepto de "XAML suelto'. XAML suelta es básicamente la capacidad que le permite abrir cualquier archivo XAML en su disco duro (o un enlace en una página web) y 'ejecutar' dentro de un navegador sin compilación.

Mira lo que XAML suelta la muestra que tiene una serie de botones y plantillas de control a medida que había implementado, http://wpf.ria-labs.com/ux.xaml en este blog simplemente abre en IE. puede cargar el XAML a una aplicación WPF y se puede utilizar.

+0

FWIW, pude abrirlo bien usando FF3. Tengo .NET 3.5SP1 instalado, si eso importa. – Andy

+0

Pero realmente no responde la pregunta. El OP indicó específicamente que se trataba de una aplicación de WPF, por lo que la capacidad de XAML para mostrarse en un navegador web es completamente diferente. – GalacticCowboy

+0

Utilicé 'navegador web' solo para explicar más características del concepto LooseXAML. –

7

Gracias impensableMayhem para la referencia.

El problema con el XAML suelto es que el XamlReader, cuando se invoca en el tiempo de ejecución, no puede conectar eventos a funciones en sus ensamblajes, ni hay un mecanismo para cargar dinámicamente ensamblajes. La forma en que los manejadores de eventos enrutados están especificados en XAML es uno de los mayores defectos de diseño de WPF/XAML y hace que XAML suelto sea inútil.

El trabajo que he realizado en la incrustación de scripts de Dynamic Language Runtime (DLR) en XAML es útil tanto para XAML suelto como compilado. Mi intención era hacer de XAML suelto un ciudadano de primera clase en WPF al permitir eventos enrutados, comandos, convertidores de valor y otros conceptos XAML/WPF disponibles en XAML suelto. Siento que esto se ha logrado (aunque mis blogs no mencionan dinámicamente cargar ensamblajes, pero esto es sencillo).

Si persiste, es posible implementar una aplicación de Windows WPF de tal forma que los archivos xaml puedan manipularse en tiempo de ejecución. Diablos, puede generar dinámicamente XAML con scripts incrustados, no requiere ensamblaje. Hombre, esa es una de las cosas más divertidas que he dicho durante mucho tiempo.

Sin embargo, tenga en cuenta que la "X" en XAML es solo un término de marketing. No es extensible desde el punto de vista de la ingeniería, así que espera un mundo de dolor cuando salgas del camino establecido por Microsoft. Estaré encantado de ayudarte si sigues este camino: detalles de contacto en mi sitio web (www.thinkbottomup.com.au).

Cheers,

Dan

2

Tome un vistazo a http://xtrememvvm.codeplex.com/

Permite le permite utilizar archivos XAML sueltos, pero todavía gancho en eventos, enlaces de datos y se envía comandos.

  • arcilla

Editar el 7 de octubre de 2012: a lo solicitado por Robert Harvey, yo soy el autor del marco mencionado anteriormente. No estaba tratando de esconder nada, simplemente no creía que fuera relevante dado que es de código abierto. En cualquier caso, me aseguraré de divulgar mi afiliación (si corresponde) en futuras publicaciones.

+0

Al publicar respuestas que hacen referencia a productos (comerciales o de otro tipo), es costumbre divulgar [su afiliación] (http://xtrememvvm.codeplex.com/team/view) en su respuesta. Más información aquí: http://stackoverflow.com/faq#promotion –

Cuestiones relacionadas