WPF: Ersetzen Sie die XAML einer Seite oder einen Usercontrol (beide sind ok) zur Laufzeit?

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

  •  29-09-2019
  •  | 
  •  

Frage

Ich weiß, dass es möglich ist, eine XAML zu analysieren - Datei zur Laufzeit und eine UIElement erstellen, die ich in meine Seiten Raster einfügen kann, kein Problem dort

.

Aber was ich wirklich will, ist die ganze XAML meiner Seite oder Usercontrol zu ersetzen, ist das möglich, auch?

Begründung:

Ich mag die Gelegenheit, dem Benutzer meiner Anwendung geben, um die Anwendung laufen zu lassen (Start dauert ewig - und das kann nicht wegen einiger Altlasten gekürzt werden) und einfach die Ansicht aktualisieren, indem Sie „Strg + s“ in Mischung .

War es hilfreich?

Lösung

Es hängt davon ab, ob Sie Event-Handler anhängen oder verwenden Sie das „Name“ oder „x: Name“. Attribut Zugriff UI-Elemente aus dem Code

Nizza reine MVVM Anwendung

Zuerst nehmen wir an, Sie eine schöne reine MVVM-Anwendung, die Verwendungen verbindlich und Befehle ausschließlich, so dass Sie nicht genannt UI-Elemente oder Code-Behind verwenden Event-Handler. Gut für Sie: Sie haben eine schöne, saubere Anwendungsarchitektur und ich, wie Sie

.

In diesem Fall alles, was Sie tun müssen, ist eine temporäre Kopie der XAML-Datei erstellen, mit der x: Class-Attribute entfernt und Aufruf:

 Application.LoadComponent(this, uriToTemporaryCopy);

Hässliche unreiner nicht-MVVM Anwendung

Nun wollen wir annehmen, dass Sie ein Element mit x Namen verwendet: Name oder Namen aus dem Code-behind, oder Sie angebracht, um ein Event-Handler mit XAML (weniger frech, aber nicht rein entweder) (Frech, frech, freches!). Sie haben nicht eine schöne, saubere Architektur, aber ich, wie Sie trotzdem noch.

In diesem Fall Application.LoadComponent den Trick selbst nicht tun, da diese Einstellungen Integration erfordern mit dem Code-behind. Sie müssen auch einen Weg finden, die BAML-Compiler aufzurufen.

Da die Code-Behind-Integration bereits in Ihre Seite oder Usercontrol Unterklasse erstellt wird, gibt es einige Einschränkungen:

  1. Sie können nicht hinzufügen, entfernen oder die Reihenfolge der Zuweisungen Ereignishandler ändern
  2. Sie können nicht die Namen oder Sequenzen von benannten Elemente ändern oder fügen Sie mehr mit dem Namen Elemente

Wenn Sie durch diese Regeln halten, im Allgemeinen den generierten Code, der in die Klasse aufgenommen wird, nicht ändern, deshalb können Sie die neue XAML-Datei in eine laufende Anwendung laden, ohne etwas zu brechen.

Das Verfahren ist:

  1. Übersetzen der XAML-Datei BAML entweder durch A) Aufbau des enthaltenden Projekt, B) ein temporäres Projekt erstellen und das Kompilieren oder C) direkt auf die Markup-Compiler Aufgaben in PresentationBuildTasks aufrufen.
  2. Verwenden Sie Application.LoadComponent die BAML-Datei zu laden genauso wie für die bearbeitete XAML-Datei in der reinen Lösung hat.

In einem kompilierten CSPROJ Projekt, werden alle kompilierten BAML Dateien werden unter dem obj / debug oder obj / Release-Verzeichnis mit einer Erweiterung von .baml gefunden werden. Wenn Sie die Markup-Compiler Aufgabe direkt anrufen können Sie auf der Ausgabestelle entscheiden.

Was ist eine BAML-Datei?

Für diejenigen, die nicht wissen, BAML ist im Grunde eine komprimierte und optimierte binäre Form von XAML und ist die Art und Weise Ihrer XAML in Ihrem EXE- oder DLL gespeichert sind. Es hat auch Funktionen für die Anbindung direkt an generierten Code, der XAML nicht hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top