Autor Beitrag
veruntchik
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Di 24.05.11 17:19 
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:

ausblenden 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 user profile iconChristian S.: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 24.05.11 18:52 
Hallo,

was ist denn der Inhalt (d.h. oberste Knoten) der XAML-Datei?
StartupUri kann nur 'Window' bzw. NavigationWindow (und deren Abkömmlinge) laden, s. msdn.microsoft.com/d...tion.startupuri.aspx

Alternativ kannst du auch die Klasse 'XamlReader' bzw. 'Application.LoadComponent(uri)' versuchen.
veruntchik Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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;*


ausblenden 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 user profile iconChristian S.: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 25.05.11 19:13 
Hallo again,

um dynamisch auf Elemente zuzugreifen, kannst du die Methode FindName() verwenden, z.B.:
ausblenden C#-Quelltext
1:
2:
TextBox tb = (TextBox)window.FindName("textBoxName");
tb.Text = "Th69";


Wie sieht denn deine Xaml-Datei aus? Und was genau funktioneirt an deinem bisherigen Code nicht?

Evtl hilft dir auch stackoverflow.com/qu...i-of-wpf-application weiter?

Und zuletzt noch ein Tuturial für "Dynamic UI in WPF": www.codeproject.com/KB/WPF/DynamicUIs.aspx
lalan4p
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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.
ausblenden C#-Quelltext
1:
2:
3:
4:
FileStream stream = new FileStream("C:/xaml2.xaml", FileMode.Open, FileAccess.Read);
UIElement newWindow = (UIElement)XamlReader.Load(stream);
//stackPanel ist ein vorhandenes UIElement in deinem MainWindow.
stackPanel.Children.Add(newWindow);


Eine XAML-Datei könnte folgendermaßen aussehen:
ausblenden 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 ist eine super Einführung in das DataBinding. Ansonsten auch mal nach dem MVVM-Pattern googlen.
veruntchik Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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