Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Empfohlene Antworten

Veröffentlicht

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

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

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

Falls es dir weiterhilft:

Du Kannst Usercontrols erstellen, und die dann einbinden.

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.

Vielen Dank, das hat mir sehr weitergeholfen :)

  • 1 Monat später...

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...

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.