Laden...

2 WPF Fenster -> Daten zwischen Fenster nutzen ?

Erstellt von cybermailer vor 10 Jahren Letzter Beitrag vor 10 Jahren 12.400 Views
Thema geschlossen
C
cybermailer Themenstarter:in
14 Beiträge seit 2013
vor 10 Jahren
2 WPF Fenster -> Daten zwischen Fenster nutzen ?

Hallo habe ein kleines Projekt:

Fenster 1 -> Zeigt einen Istzustand gewisse Werte

Buttons: Werte hinzufügen, löschen, Ändern

Fenster 2 ->

Dort wird der Wert hinzugefügt, oder geändert

Dh. die Daten müssen von F1 -> F2 gehen und retour.

CODE:

Fenster 1 C#

private void Button_Click(object sender, RoutedEventArgs e)
        {
            

            Button but = sender as Button;
            TreeViewItem tvi = (TreeViewItem)treeView1.SelectedItem;
            
            switch (but.Name)
            {
                case "Button_Hinzufügen":
                    TreeViewItem child = new TreeViewItem();

                    add hinzufuegen_fenster = new add();
                    hinzufuegen_fenster.Owner = this;
                    hinzufuegen_fenster.WindowStartupLocation = WindowStartupLocation.CenterOwner;
                    hinzufuegen_fenster.ShowDialog();
                    
                    child.Header = bezeichnung;

                    tvi.Items.Add(child);
                    tvi.IsExpanded = true; // expand to show new child element
                    break;

                case "Button_Entfernen":
                    if (tvi != treeView1.Items.GetItemAt(0)) // remove only if not root
                    {
                        ((TreeViewItem)tvi.Parent).Items.Remove(tvi);
                    }
                    break;
                case "Button_Aendern":
                    tvi.Header = tvi.Header.ToString() + "C";
                    break;
            }

        }

Fenster 1 XAML

<DockPanel Name="dockpanelanzeige" LastChildFill="True">
        <StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal">
            <Button Name="Button_Hinzufügen" Click="Button_Click" Margin="3">Hinzufügen</Button>
            <Button Name="Button_Aendern" Click="Button_Click" Margin="3">Ändern</Button>
            <Button Name="Button_Entfernen" Click="Button_Click" Margin="3">Entfernen</Button>
        </StackPanel>
        <TreeView Name="treeView1">
            <TreeViewItem Name="treeViewItem1" Header="Root"/>
            
        </TreeView>        
    </DockPanel>

Im Fenster 2 C#

public add()
        {
            InitializeComponent();
        }

        string bezeichnung;

        private void speichern_Click(object sender, RoutedEventArgs e)
        {
            bezeichnung = textbox_bezeichnung.Text;
            Close();
        }

Fenster 2 XAML

<DockPanel>
        <StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal">
            <Button Name="speichern" Margin="3" Click="speichern_Click">Speichern</Button>
            <Button Name="abbrechen" Margin="3" Click="abbrechen_Click">Abbrechen</Button>
            
        </StackPanel>
        <StackPanel>
            <Label Content="Bezeichnung eingeben:"></Label>
            <TextBox Height="23" Name="textbox_bezeichnung" Width="220" />
        </StackPanel>
    </DockPanel>

Was wäre die simplste herangehensweise dass ich die Variable bezeichnung vom Fenster 1 zu 2 und umgekehrt bekommen?

Danke für Eure Hilfe.

3.430 Beiträge seit 2007
vor 10 Jahren

Hallo cybermailer,

siehe => [FAQ] Kommunikation von 2 Forms

Grüße
Michael

C
cybermailer Themenstarter:in
14 Beiträge seit 2013
vor 10 Jahren

danke für die info, hab mir diese bereits angesehen die ist für mich einwenig overkill.

Ich möchte ja nur dass der String vom Popup Fenster (welcher in einer TextBox) eingegeben wird zurückkommt. Damit ich diesen verwenden kann im 1. Fenster.

Gibt es da eine Möglichkeit?

---> Lösung gefunden

Fenster 1 -> Objekt an Fenster 2 übergeben.

z.b. bei Label:

im Fenster 1:

add neues_fenster = new add(label1);
            neues_fenster.Owner = this;
            neues_fenster.WindowStartupLocation = WindowStartupLocation.CenterOwner;
            neues_fenster.ShowDialog();

im Fenster 2:

private Label labelFromMainWindow;
       
        public add(Label _label)
        {
            InitializeComponent();
            labelFromMainWindow = _label;
        }

Reicht vollkommen für meine Zwecke aus...

U
1.688 Beiträge seit 2007
vor 10 Jahren

---> Lösung gefunden

Ich hätte es jetzt Frickelei genannt. Es ist einfach ungünstig, solche wechselseitigen Abhängigkeiten einzubauen. Was machst Du z. B., wenn Du unterschiedliche Label oder Textboxen aktualisieren willst?
Eine deutlich bessere Alternative zeigt die :rtfm: zu ShowDialog.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo ujr,

ShowDialog führt zu modalen Fenstern und das ist nicht mehr Stand der Kunst. Das brauchen wir aber hier nicht zu besprechen, denn das wurde schon ausführlich in Warten auf Schließen einer anderen Form [und warum man Dialoge nicht modal machen sollte] besprochen.

Hallo cybermailer,

ebenso, wie die Form2-Form1-Thematik generell. Die von dir gewählte Lösung ist - wie ujr gesagt hat - schlecht. Bessere Lösungen werden in der FAQ genannt. Du musst dich nur darauf einlassen.

Beachte bitte [Hinweis] Wie poste ich richtig? Punkt 1.1 und 1.1.1.

Dass die FAQ sich hauptsächlich auf Windows Forms bezieht, spielt keine Rolle, weil die Prinzipien der Kommunikation von Fenstern in WPF die gleichen sind.

herbivore

Thema geschlossen