Zum Inhalt springen

[C#/WPF] Dynamisches Laden von XAML-Content


Empfohlene Beiträge

Geschrieben

Hi,

kennt sich hier vielleicht jemand mit WPF aus?

Ich möchte innerhalb meiner Anwendung dynamisch XAML-Dateien laden, die nicht als Ressource zur Verfügung stehen, sondern nachträglich in das Anwendungsverzeichnis kopiert werden.

Mit XAML-Dateien, die im Projekt eingefügt werden funktioniert das wunderbar, wenn ich es jetzt aber mit externen probiere, bekomme ich eine Exception, dass "LoadComponent()" keine absoluten URIs akzeptiert.

Kann mir jemand sagen, wie ich das umgehen kann oder wie man es sonst hinbekommt externe XAML-Dateien zu laden? Kann man XAML-Dateien nachträglich als Ressource binden? Falls ja, wie?

Entsprechender Code-Snippet:

        private void addContent(String XAMLFilename)

        {

            Uri xamlFile;


            xamlFile = new Uri(AppDomain.CurrentDomain.BaseDirectory + "pages\\" + XAMLFilename, UriKind.Absolute);

            this.XAMLContent = (StackPanel)Application.LoadComponent(xamlFile);

        }

Vielen Dank und viele Grüße

MiBo

Geschrieben

Hi,

du kannst mit der Zeile

this.Content = XamlReader.Load(stream);

XAML Code dynamisch aus einem Stream laden. Einen FileStream solltest du problemlos öffnen können.

Viele Grüße,

Sascha

Geschrieben

Vielen Dank für die Antwort, ich habe allerdings mittlerweile erfahren, dass das sowieso nicht so geht, wie ich es mir gedacht habe. Anscheinend kann man keine XML-Dateien mit Code-Behind zur Laufzeit laden und verwenden.

Kann das jemand bestätigen? Falls es so ist, wird mir wohl nichts anderes übrig bleiben, als zu einer Art AddIn-System überzugehen ... oder kann ich irgendwie anders GUI-Elemente mit Funktionen nachträglich einbinden?

Viele Grüße

Geschrieben

Was du dann machen könntest ist folgendes:

Einen Ordner anlegen, in den du Assemblies packen kannst. Dann lädst du die DLLs innerhalb dieses Ordners in deine Application Domain und lässt dir über Reflection ne Liste der Typen innerhalb dieser Assembly zurückgeben, die sich von UserControl ableiten. Diese Instanzierst du dann über den Activator.

Dann müsstest du die UserControls mit CodeBehind halt jeweils in eine DLL kompilieren.

Das CodeBehind nachladen könnte mit C# 4 kommen (aber reine spekulation), weil MS da "Compiler as a service" angekündigt hat.

  • 1 Monat später...
Geschrieben

Ich stehe vermutlich vor genau dem gleichen Problem, dass ich XAML-Dateien, welche Events enthalten nicht dynamisch nachladen kann.

Über das folgende Konstrukt lässt sich die XAML-Datei problemlos zum vorhandenen Window hinzufügen:

using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read))

{

    Grid gridContent = (Grid)XamlReader.Load(fs);

    this.Content = gridContent;

}
Enthält die XAML-Datei aber ein Element, welches ein Event anspricht (z.B. einen Button), schlägt die ganze Sache zur Laufzeit mit folgender Fehlermeldung fehl:
Die Ereignisse angebende XAML-Datei muss kompiliert werden. Zeile 4 Position 30.
An dieser Stelle ist dann folgender Code zu finden:
<Button Height="28" Click="button1_clicked">Toller Knopf</Button>

                    ^

                Position 30 (eingerückt)

Ziel meiner Bestrebung ist es, die XAML-Datei von einer anderen Applikation generieren zu lassen, um sie dann in meiner WPF-Anwendung anzuzeigen. Die Events in der Code-Behind-Datei sind dabei so dynamisch, dass sie allgemeingültig aufgerufen werden können.

Derzeit habe ich die Code-Behind-Assembly in mein Projekt eingebunden.

Ich vermute, dass das Problem das gleiche ist, wie das oben beschriebene. Allerdings habe ich die Beschreibung mit dem dynamischen Laden der DLLs nicht verstanden, bzw. in wie weit es das Problem lösen soll.

Selbst wenn ich die Code-Behind-Assembly aus meinem Projekt entferne (und auch nicht dynamisch nachlade), taucht der Fehler auf, dass die XAML-Datei kompiliert werden muss.

Gibt es dazu bereits eine Lösung oder funktioniert das von mir angedachte Vorgehen nur mit dem erwähnten Compiler as a Service?

Ich bin für jeden Hinweis dankbar.

  • 1 Monat später...
Geschrieben

Hallo,

ich hatte auch dieses Problem. Bei mir konnte ich es allerdings mit Makros vergleichen, sprich: Die Methode, die durch das auslösen des Events bearbeitet werden soll, ist dem Hauptprogramm bekannt.

Im Beispiel von staratnight, müsste also die "button1_clicked"-Methode in dem Programm, welches die XAML-Datei nachlädt, implementiert werden. Dann kann man ganz einfach die XAML-Datei nachladen und mit Hilfe der AddHandler Methode die Events für die entsprechenden Controls nachladen.

Wenn das Problem also auf das von mir Beschriebene reduzierbar/erweiterbar ist, dann könntest du das so machen.

Grüße

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...