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