Entwickler-Ecke
WPF / Silverlight - Wie kann man in WPF eine Oberfläche dynamisch erzeugen?
veruntchik - Di 24.05.11 17:19
Titel: Wie kann man in WPF eine Oberfläche dynamisch erzeugen?
Hallo Leute,
ich zerbreche mir grad den Kopf, wie ich am besten eine Oberfläche in WPF dynamisch erzeugen kann. Zur Verfügung habe eine Beischreibung der Oberfläche, die ich erzeugen möchte in XAML vorliegen. Was könnte man da machen? Ich habe mir es so ungefähr überlegt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| using System; using System.Windows;
namespace dynWPF { class App : Application { public App() { App a = new App(); a.Startup += startup;
}
public void startup(object sender, StartupEventArgs e) { ((Application)sender).StarupUri = new Uri("/MyApp;component/Forms/CustomerEntry.xaml", UriKind.Relative); } } } |
Es wird einfach eine xaml Datei ausgelesen und daraus die Oberfläche erzeugt. Aber es funktioniert nicht so richtig. Hat jemand eine Idee? Oder einen anderen Vorschlag? Es geht in die Richtung, dass man auch auf die Controlelemente zugreifen möchte. Das heißt zusätzlich zu der xaml, die geladen wird, werden Attribute überschrieben und/oder anders gesetzt.
Vielen Dank im Voraus.
lg veruntchik
Moderiert von
Christian S.: C#-Tags hinzugefügt
veruntchik - Mi 25.05.11 09:31
Hallo,
na natürlich Window ist mein Startknoten. Aber fehlt da nicht irgendwas was das Fenster anzeigen soll? Sowas wie ...Run();-Methode?
lg veruntchik
veruntchik - Mi 25.05.11 11:15
Hallo Leute,
ich brauche auf jeden Fall ein Beispiel noch wie man auf die Controls aus der XAML zugreift. Oder wie schon erwähnt diese überschreiben in der Klasse :
...
class App : Application
...
Oder passiert das schon hier das Setzen der Werte?:*((Application)sender).MainWindow.Height=10000;*
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| using System; using System.Windows;
namespace dynWPF { public partial class App : Application { public App() { App a = new App();
a.Startup += startup; a.MainWindow.Activate(); }
public void startup(object sender, EventArgs e) { ((Application)sender).StartupUri = new Uri("/MyApp;xaml/Ausgabe.xaml", UriKind.Relative); ((Application)sender).MainWindow.Height=10000; } }
} |
Tut mir Leid ich kann es nicht ausprobieren, bei mir läuft es einfach nicht.
Und wie würde es bei den Controls aussehen? Mit: System.Windows.Controls.Button greife ich allgemein auf irgendein Button zu, aber ich möchte auf den zugreifen der in meiner XAML steht. Wie mache ich das am Besten?
Bitte wenn ihr Vorschläge habt, dann gebt sie weiter, oder eine interessante Seite auch...oder Tutorials...oder Bücher...oder Artikel...oder Lernkurs...usw
lg veruntchik
Moderiert von
Christian S.: C#-Tags hinzugefügt
lalan4p - Mi 25.05.11 20:40
Eigentlich relativ einfach. Zumindest das einlesen der XAML Datei und die Anzeige. Ich würde aber hierbei kein komplett neues Window erzeugen, sondern das UIElement im bereits existierenden Fenster platzieren.
C#-Quelltext
1: 2: 3: 4:
| FileStream stream = new FileStream("C:/xaml2.xaml", FileMode.Open, FileAccess.Read); UIElement newWindow = (UIElement)XamlReader.Load(stream); stackPanel.Children.Add(newWindow); |
Eine XAML-Datei könnte folgendermaßen aussehen:
XML-Daten
1: 2: 3: 4: 5:
| <Grid Margin="10" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Button x:Name="SubmitChanges" Command="{Binding Path=Button_Next}" Content="Save" /> </Grid> |
Das Hauptproblem an der ganzen Sache ist Daten und eine Interaktionslogik in die ganze Geschichte mit reinzubringen.
Du willst ja sicher auch Buttons verwenden und irgendwelche Daten darstellen. Um jetzt nicht in der Code-Behind Datei die ganzen UIElemente zu finden und diesen Daten oder Interaktionen (z.b. Klicks) zuzuweisen, empfehle ich dir das ganze mittels DataBinding zu lösen. Denn genau dafür ist der XAML-Code ausgelegt.
Hier [
http://openbook.galileocomputing.de/visual_csharp_2010/visual_csharp_2010_21_001.htm#mjaa3a03eb258547b02162e9ad248681a8] ist eine super Einführung in das DataBinding. Ansonsten auch mal nach dem MVVM-Pattern googlen.
veruntchik - Fr 27.05.11 08:59
Hallo,
vielen vielen Dank erstmal für die Antworten. Da komme ich bischen weiter in der Hinsicht.
lg veruntchik
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!