Laden...

[WPF] Frame Pages Seite im Ordner wird nicht angezeigt

Erstellt von xKushGene vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.772 Views
X
xKushGene Themenstarter:in
91 Beiträge seit 2017
vor 7 Jahren
[WPF] Frame Pages Seite im Ordner wird nicht angezeigt

Guten Tag.
Ich habe in meinem Programm mehrere Seiten, die auch funktionierend angezeigt werden:

 private void privatkunden_Click(object sender, RoutedEventArgs e)
        {
            Main.Content = new Privatkunden.privatkunden_show();
        }

Main ist der name vom Frame.

In der privatkunden_show habe ich einen button, welcher die Seite privatkunden_add aufrufen soll:

 private void addPrivatkunde(object sender, RoutedEventArgs e)
        {
            MainWindow mainwindow = new MainWindow();
            mainwindow.Main.Content = new Privatkunden.privatkunden_add();
        }

Allerdings, wird mir beim Klick auf den Button nichts angezeigt. Bzw. passiert einfach nichts.
Der Code sieht meiner Ansicht nach richtig aus und ich wüsste nun nicht, was ich anders machen muss.

Vielleicht kann mir hier ja jemand erklären, wieso die Seite privatkunden_add nicht aufgerufen wird.

3.170 Beiträge seit 2006
vor 7 Jahren

Hallo,

MainWindow mainwindow = new MainWindow();

Du erstellst also aus Deinem privatkunden_show heraus eine neue(!) Instanz des Hauptfensters und machst dann was damit -> diese neue Hauptfenster wird aber nie angezeigt.

Das dann im vorhandenen Fenster nix passiert, ist wohl klar.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

X
xKushGene Themenstarter:in
91 Beiträge seit 2017
vor 7 Jahren

Ich will ja auf das Frame im Hauptfenster zugreifen. In diesem Frame möchte ich nicht mehr privatkunden_show anzeigen (wie es zu dem Zeitpunkt der Fall ist) sondern beim Klick auf den Erstellen Button, privatkunden_add anzeigen.

Wie genau mach ich das, wenn nicht so?
Ich dachte mithilfe von


MainWindow mainwindow = new MainWindow();
mainwindow.Main.Content = new Privatkunden.privatkunden_add();

greife ich auf das Frame "Main" im Hauptfenster zu und ändere den Content dann dementsprechend.

709 Beiträge seit 2008
vor 7 Jahren

[...]greife ich auf das Frame "Main" im Hauptfenster zu und ändere den Content dann dementsprechend.

Du greifst damit aber nicht auf das bestehende Hauptfenster sondern auf das neu erstellte Hauptfenster zu. Das neue Hauptfenster wird zudem nicht angezeigt.

4.931 Beiträge seit 2008
vor 7 Jahren

Ein untergeordnetes Fenster (bzw. Frame) sollte niemals direkt auf ein übergeordnetes zugreifen, s.a. [FAQ] Kommunikation von 2 Forms oder meinen eigenen Artikel dazu: Kommunikation von 2 Forms
Benutze dazu also ein Ereignis (event).

X
xKushGene Themenstarter:in
91 Beiträge seit 2017
vor 7 Jahren

Ich verstehe das nicht so ganz.

Also mit:

 Privatkunden.privatkunden_show show = new Privatkunden.privatkunden_show();

Würde ich in MainWindow die Datei privatkunden_show instanzieren.
Das heißt, dass MainWindow, "privatkunden_show" kennt.

Hoffe der Ansatz ist schon mal richtig.
Soviel habe ich bisher zumindest verstanden.

Wie merkt MainWindow nun aber, dass auf privatkunden_show der Button "addPrivatkunde" getätigt wurde? Und wie lege ich in MainWindow dann fest, dass beim Klick von dem Button, das Frame Main den Content von privatkunden_add bekommt ?

Edit:
Bei deinem Artikel war ich etwas besser aufgehoben, allerdings verstehe ich hier auch noch ein paar Dinge nicht.

Mein privatkunden_show sieht nun wie folgt aus:

public partial class privatkunden_show : Page
    {
        public privatkunden_show()
        {
            InitializeComponent();
        }
        
        // TESTING
        public class TextEventArgs : EventArgs
        {
            public TextEventArgs(object text)
            {
                Text = text;
            }

            public object Text { get; set; }
        }

        public event EventHandler<TextEventArgs> UpdateText;

        public void addPrivatkunde(object sender, RoutedEventArgs e)
        {
            OnUpdateText(new TextEventArgs(new Privatkunden.privatkunden_add()));
        }

        protected virtual void OnUpdateText(TextEventArgs e)
        {
            EventHandler<TextEventArgs> ev = UpdateText;
            if (ev != null)
                ev(this, e);
        }
    }

Also in etwa wie bei deinem Tutorial.
(Hatte Jetzt einfach mal alles übernommen mit den Text, da es am Anfang bei mir fehlerhaft war.

Und in meinem MainWindow habe ich folgendes hinzugefügt:

 void UpdateLabelText(object sender, Privatkunden.privatkunden_show.TextEventArgs e)
        {
            Main.Content = e.Text;
        }

Allerdings funktioniert das nicht. Und ich weiß auch nicht, wie MainWindow bemerken kann, dass bei privatkunden_show der Button addPrivatkunde getätigt wurde.

X
xKushGene Themenstarter:in
91 Beiträge seit 2017
vor 7 Jahren

Bin leider immer noch nicht weitergekommen.
Auf Stackoverflow hat jemand folgendes geschrieben:

How about adding an event in privatecustomer_show.xaml that the MainWindow.xaml can subscribe to.

Like this

  public event EventHandler AddPrivateCustomer;

  protected virtual void OnAddPrivateCustomerEventArgs e) 
  {
     if (AddPrivateCustomer!= null)
        AddPrivateCustomer(this, e);
  }

Update: Please note the updated code, I made a copy'n'paste mistake in my first version.

Change your: private void privatecustomer_Click(object sender, RoutedEventArgs e)

To:

private void privatecustomer_Click(object sender, RoutedEventArgs e)
{
  var privateCustomerContent=new Privatecustomer.privatecustomer_show();
  privateCustomerContent.AddPrivateCustomer+=onClick_addPrivateCustomer;
  Main.Content = privateCustomerContent;
}

private onClick_addPrivateCustomer(object o,EventArgs e)
{
  // Change Main.Content
}

The idea is that your privatecustomer_show control sends events for when it want to change something outside of what it has access to. You MainWindow which has full control of all its child windows will then subscribe to each event.

Aber irgendwie buggt folgender Code rum:

protected virtual void OnAddPrivateCustomerEventArgs e) 
  {
     if (AddPrivateCustomer!= null)
        AddPrivateCustomer(this, e);
  }

habe es mit

protected virtual void OnAddPrivateCustomer(EventArgs e) 

probiert aber auch kein Erfolg.

Schaue mir auch Tutorials zu MVVM an. Aber so richtig verstehen tue ich auch nichts.
Gerade verfolge ich eine Tutorialreihe auf YouTube wo der Uploader MvvmLight benutzt. Komme mit dem ganzen aber ein wenig Durcheinander..