WPF: Reemplazar el XAML de una página o control de usuario (tanto es aceptable) en tiempo de ejecución?

StackOverflow https://stackoverflow.com/questions/3107223

  •  29-09-2019
  •  | 
  •  

Pregunta

Sé que es posible analizar un XAML - archivo en tiempo de ejecución y crear un UIElement que puedo insertar en mi página de rejilla, no hay problema

.

Pero lo que realmente quiero es reemplazar todo el XAML de mi página o control de usuario, es posible que también?

Razonamiento:

Quiero dar a los usuarios de mi solicitud la oportunidad de tener la aplicación se ejecute (puesta en marcha lleva mucho tiempo - y que no puede ser acortado debido a algunos problemas heredados) y simplemente actualizar la vista por "ctrl + s" Blend .

¿Fue útil?

Solución

Depende de si se adjunta controladores de eventos o utilizar el "Nombre" o "x: Name". Atributo para los elementos de interfaz de usuario de acceso a partir del código

Niza aplicación MVVM pura

En primer lugar vamos a suponer que usted tiene una buena aplicación MVVM pura que utiliza la vinculación y los comandos de modo exclusivo, por lo que no está utilizando elementos de la interfaz con nombre o código subyacente controladores de eventos. Bueno para usted: Usted tiene una buena arquitectura de la aplicación limpia y yo como tú

.

En ese caso, todo lo que hay que hacer es crear una copia temporal del archivo XAML con el atributo x: Class retira, y la llamada:

 Application.LoadComponent(this, uriToTemporaryCopy);

aplicación feo impuro no MVVM

Ahora vamos a suponer que utilizó un elemento llamado con x: Nombre o denominación del código subyacente, o que ha conectado un controlador de eventos usando XAML (menos malo, pero no es puro tampoco) (travieso, travieso, travieso!). Usted no tiene una buena arquitectura limpia, pero todavía me gusta de todos modos.

En este caso, Application.LoadComponent no hacer el truco por sí mismo debido a que estos ajustes requieren la integración con el código subyacente. También es necesario encontrar una manera de invocar el compilador BAML.

Dado que el código subyacente de integración ya se compila en su página o control de usuario subclase, hay algunas restricciones:

  1. No se puede agregar, quitar o cambiar la secuencia de asignaciones de controlador de eventos
  2. No se pueden cambiar los nombres o las secuencias de elementos nombrados o añadir más elementos nombrados

Si se cumple con estas reglas, en general, el código generado que se incorpora en su clase no va a cambiar, por lo tanto, se puede cargar el nuevo archivo XAML en una aplicación que se ejecuta sin romper nada.

El procedimiento es:

  1. Compilar el archivo XAML a BAML ya sea mediante a) la construcción del proyecto que contiene, B) la creación de un proyecto temporal y la compilación de eso, o C) llamando directamente a las tareas de marcado del compilador en PresentationBuildTasks.
  2. Uso Application.LoadComponent para cargar el archivo BAML tal como lo hizo para el archivo XAML editado en la solución pura.

En un proyecto compilado .csproj, todos los archivos compilados BAML podrán ser visualizadas en la depuración o directorio obj / obj / liberación con una extensión de .baml. Si se llama a la tarea de marcado directamente compilador puede decidir sobre la ubicación de salida.

¿Qué es un archivo BAML?

Para aquellos que no lo saben, BAML es básicamente un formato binario comprimido y optimizado de XAML, y es la forma en que su XAML se almacena dentro de su .exe o .dll. También tiene la capacidad para enlazar directamente al código generado, que no tiene XAML.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top