WPF: Sostituire il XAML di una pagina o di UserControl (entrambi è ok) in fase di esecuzione?

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

  •  29-09-2019
  •  | 
  •  

Domanda

So che è possibile analizzare un XAML - File in fase di esecuzione e creare un UIElement che posso inserire nella mia griglia di pagine, nessun problema

.

Ma quello che voglio veramente è quello di sostituire l'intero XAML della mia pagina o di UserControl, è che possibile, anche?

Il ragionamento:

Voglio dare gli utenti della mia applicazione la possibilità di avere la corsa di applicazione (startup prende le età - e che non può essere ridotto a causa di alcuni problemi di eredità) e semplicemente aggiornare la vista da "ctrl + s" in Blend .

È stato utile?

Soluzione

Dipende se si allega i gestori di eventi o utilizzare il "nome" o "x: Name". Attributo per gli elementi dell'interfaccia utente l'accesso da codice

applicazione MVVM puro Nizza

Per prima cosa supponiamo di avere una simpatica applicazione pura MVVM che usi vincolanti e comandi esclusivamente, in modo che non si sta utilizzando elementi dell'interfaccia utente di nome o di code-behind gestori di eventi. Buon per voi: Hai una bella architettura applicativa pulito e io come te

.

In questo caso tutto quello che dovete fare è creare una copia temporanea del file XAML con l'attributo x: Class rimosso, e la chiamata:

 Application.LoadComponent(this, uriToTemporaryCopy);

Ugly applicazione impura non MVVM

Ora supponiamo che hai usato un elemento denominato con x: Name o nome dal code-behind, o è stato collegato un gestore di eventi utilizzando XAML (meno cattivo, ma non pura o) (cattivo, cattivo, cattivo!). Non si dispone di una bella architettura pulita, ma mi piace ancora lo stesso.

In questo caso, Application.LoadComponent non farà il trucco da solo perché queste impostazioni richiedono l'integrazione con il code-behind. È inoltre necessario trovare un modo per richiamare il compilatore BAML.

Poiché il code-behind di integrazione è già compilato nella tua pagina o UserControl sottoclasse, ci sono alcune restrizioni:

  1. Non è possibile aggiungere, rimuovere o modificare la sequenza delle assegnazioni del gestore di eventi
  2. Non è possibile modificare i nomi o sequenze di elementi di nome o aggiungere elementi più chiamati

Se si rispettano queste regole, in generale, il codice generato che è incorporato nella tua classe non cambierà, pertanto, è possibile caricare il nuovo file XAML in un'applicazione in esecuzione senza rompere nulla.

La procedura è:

  1. compilare il file XAML per BAML sia per A) la costruzione del progetto che contiene, B) la creazione di un progetto temporaneo e la compilazione che, o C) chiamando direttamente i compiti di marcatura del compilatore in PresentationBuildTasks.
  2. Usa Application.LoadComponent per caricare il file BAML così come avete fatto per il file XAML modificato nella soluzione pura.

In un progetto compilato csproj, tutti i file BAML compilati verranno trovati sotto il debug o directory obj / obj / release con un'estensione di .baml. Se si chiama il compito di marcatura compilatore direttamente si può decidere la posizione di uscita.

Che cosa è un file BAML?

Per chi non lo sapesse, BAML è sostanzialmente una forma binaria compressa e ottimizzata di XAML, ed è il modo in cui il codice XAML viene memorizzato all'interno del vostro exe o dll. Essa ha anche funzionalità per il collegamento diretto al codice generato, che XAML non ha.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top