MiBo Geschrieben 18. November 2008 Geschrieben 18. November 2008 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 Zitieren
Araq Geschrieben 24. November 2008 Geschrieben 24. November 2008 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 Zitieren
MiBo Geschrieben 25. November 2008 Autor Geschrieben 25. November 2008 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 Zitieren
MES_K Geschrieben 25. November 2008 Geschrieben 25. November 2008 Falls es dir weiterhilft: Du Kannst Usercontrols erstellen, und die dann einbinden. Zitieren
Araq Geschrieben 25. November 2008 Geschrieben 25. November 2008 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. Zitieren
MiBo Geschrieben 26. November 2008 Autor Geschrieben 26. November 2008 Vielen Dank, das hat mir sehr weitergeholfen Zitieren
staratnight Geschrieben 15. Januar 2009 Geschrieben 15. Januar 2009 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. Zitieren
riote Geschrieben 27. Februar 2009 Geschrieben 27. Februar 2009 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 Zitieren
Empfohlene Beiträge
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.