WPF: Remplacer le XAML d'une page ou usercontrol (les deux est ok) lors de l'exécution?

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

  •  29-09-2019
  •  | 
  •  

Question

Je sais qu'il est possible d'analyser un XAML - fichier lors de l'exécution et de créer un UIElement que je peux insérer dans ma grille de pages, pas de problème

.

Mais ce que je veux vraiment est de remplacer l'ensemble XAML de ma page ou usercontrol, est-ce possible aussi?

Raisonnement:

Je veux donner les utilisateurs de ma demande la possibilité d'avoir l'exécution de l'application (démarrage prend les âges - et qui ne peut être raccourcie en raison de certains problèmes hérités du passé) et mettre à jour simplement la vue par « ctrl + s » dans le mélange .

Était-ce utile?

La solution

Cela dépend si vous attachez des gestionnaires d'événements ou d'utiliser le « Nom » ou « x: Name ». Attribut à des éléments d'interface d'accès du code

Nice pur application MVVM

Tout d'abord, supposons que vous avez une belle application MVVM pure qui utilise la liaison et les commandes exclusivement, de sorte que vous n'utilisez pas des éléments de l'interface utilisateur nommé ou code-behind gestionnaires d'événements. Bon pour vous: Vous avez une belle architecture d'application propre et je comme vous

.

Dans ce cas, tout ce que vous devez faire est de créer une copie temporaire de votre fichier XAML avec l'attribut x: Class supprimé et appel:

 Application.LoadComponent(this, uriToTemporaryCopy);

Laid demande impure non MVVM

Maintenant, supposons que vous avez utilisé un élément nommé avec x: Nom ou nom de votre code-behind, ou que vous avez joint un gestionnaire d'événement à l'aide XAML (moins méchant, mais pas pur non plus) (méchant, méchant, méchant!). Vous ne disposez pas d'une belle architecture de propre, mais je reste comme vous de toute façon.

Dans ce cas, Application.LoadComponent ne fera pas l'affaire en elle-même parce que ces paramètres nécessitent une intégration avec le code-behind. Vous devez également trouver un moyen d'invoquer le compilateur BAML.

Étant donné que le code de l'intégration est déjà compilé dans votre sous-classe Page ou du UserControl, il y a des restrictions:

  1. Vous ne pouvez pas ajouter, supprimer ou modifier la séquence des tâches de gestionnaire d'événements
  2. Vous ne pouvez pas modifier les noms ou les séquences d'éléments nommés ou ajouter des éléments plus nommés

Si vous respectez ces règles, en général, le code généré qui est incorporé dans votre classe ne changera pas, par conséquent, vous pouvez charger le nouveau fichier XAML dans une application en cours d'exécution sans casser quoi que ce soit.

La procédure est:

  1. Compile le fichier XAML à BAML soit par A) la construction du projet contenant, B) la création d'un projet temporaire et la compilation que, ou C) appelant directement les tâches du compilateur de balisage dans PresentationBuildTasks.
  2. Utilisez Application.LoadComponent pour charger le fichier BAML comme vous l'avez fait pour le fichier XAML édité dans la solution pure.

Dans un projet compilé .csproj, tous les fichiers compilés BAML seront trouvés sous l'obj / debug ou obj / répertoire de sortie avec une extension de .baml. Si vous appelez la tâche du compilateur de balisage directement, vous pouvez décider de l'emplacement de sortie.

Qu'est-ce qu'un fichier BAML?

Pour ceux qui ne connaissent pas, BAML est essentiellement une forme binaire compressé et optimisé de XAML, et la façon dont votre XAML est stocké dans votre .exe ou .dll. Il dispose également de capacités pour relier directement au code généré, qui XAML n'a pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top