2014-02-06 12 views
7

Ich habe ein Hauptfenster namens form1. in form1 Ich habe eine Schaltfläche, wenn es gedrückt wird, öffnet es form2 (form2.ShowDialog()). In form2 habe ich einen Button namens "Check". Wenn der Benutzer auf "Check" klickt, sollte er eine Überprüfung durchführen und, falls erfolgreich, ein String-Objekt erstellen und es an form1 zurückgeben. Irgendwelche Ideen zur Umsetzung? Ich möchte nichts zurückgeben, wenn der Benutzer das Fenster schließt.C# - Variable vom untergeordneten Fenster zum übergeordneten Fenster in WPF zurückgeben

Antwort

10

ein Ereignis in Ihrem zweiten Fenster erstellen, müssen die Parameter der Delegierten Ereignis enthalten, was Informationen Sie weitergeben wollen:

public class Popup : Window 
{ 
    public event Action<string> Check; 

    public void Foo() 
    { 
     //fire the event 
     if (Check != null) 
      Check("hello world"); 
    } 
} 

Dann wird das Hauptfenster auf das Ereignis abonnieren können tun, was es mit der will Information:

public class Main : Window 
{ 
    private Label label; 
    public void Foo() 
    { 
     Popup popup = new Popup(); 
     popup.Check += value => label.Content = value; 
     popup.ShowDialog(); 
    } 
} 
+0

Beat mich dazu. Ich persönlich liebe diese Methode der Inter-Window-Kommunikation. Es gibt jedoch eine andere Methode, die ich auch sehr mag, und ich werde eine Antwort veröffentlichen, die das unten enthält. –

+0

Arbeitete einwandfrei. Vielen Dank! –

+0

was ist, wenn ich zwei Saiten habe ?? Wie schreibe ich Code? 'popup.Check + = value => label.Content = Wert, label2.Content = Wert;' ?? –

0

Dies könnte auf verschiedene Arten erreicht werden. Die Methode, die Servy gepostet hat, ist ziemlich gut und wird erreichen, was Sie brauchen. Ich würde es vorziehen, die Action<sting> als Parameter für den Konstruktor übergeben und callback genannt, so ist es klar, wofür es verwendet wird, aber das ist nur eine Vorliebe Sache.

Die andere Methode, die dies ziemlich gut ist, ist über Messaging. Die MVVMLight Toolkit bietet eine großartige kleine Funktion, um solche Aufgaben zu erfüllen.

Schritt 1: Erstellen Sie eine stark typisierte Nachricht:

public class MyMessage : MessageBase 
{ 
    //Message payload implementation goes here by declaring properties, etc... 
} 

Schritt 2: Bestimmen Sie, wo und wann diese Nachricht zu veröffentlichen.

public class PublishMessage 
{ 
    public PublishMessage(){ 
    } 

    public void MyMethod() 
    { 
     //do something in this method, then send message: 
     Messenger.Default.Send(new MyMessage() { /*initialize payload here */ }); 
    } 
} 

Setp 3: Nun, da Sie die Nachricht senden, müssen Sie in der Lage sein, diese Nachricht empfangen:

public class MessageReceiver 
{ 
    public MessageReceiver() 
    { 
     Messenger.Default.Register<MyMessage>(this, message => Foo(message)); 
    } 

    public void Foo(MyMessage message) 
    { 
     //do stuff 
    } 
} 
+1

Obwohl Sie noch nicht genug von einer Implementierung bereitgestellt haben, um es mit Sicherheit zu sagen, scheint es sich bei dem, was Sie hier haben, mehr oder weniger um ein öffentliches statisches Ereignis zu handeln, das von irgendjemandem ausgelöst werden kann.Es ist nicht länger für andere Typen erkennbar, welche Ereignisse es zu abonnieren gibt, wenn sie auf eine Nachricht stoßen, es gibt keinen eingebauten Hinweis darauf, was es bedeutet, wer "verantwortlich" dafür ist, was es ist verbunden, usw. Es ist auch möglich (und eher einfach zu irrtümlich) am Ende, die unpassende Nachricht zu feuern, was Probleme an zwei verschiedenen Orten verursacht. Ich sehe hier keine Vorteile. – Servy

+0

Ich sagte nicht, dass es ein Vorteil war. Nur eine andere Art, es zu tun. Es ist ziemlich einfach herauszufinden, wer in diesem Szenario welche Nachricht abonniert hat, indem Sie Ihre Nachricht finden und überprüfen, wer sie verwendet. Es ist stark typisiert, also gibt es keine Frage darüber, welche Nachrichten Sie senden und empfangen. Die Verantwortung dafür liegt bei dem Nachrichtenempfänger, was mit der Nachricht zu tun ist. Der Absender hebt einfach eine Flagge, um zu sagen, dass etwas getan wurde. Unangemessene Nachrichten zu versenden ist ziemlich schwierig, aber möglich und erfordert nur, dass Entwickler darauf achten. –

0

Diese Antwort zwar nicht perfekt auf Ziel nützliche Menschen sein wird, dass Google selbst hier für die allgemeine Lösung, wie man zwischen Fenstern kommuniziert:

Es gibt keinen Grund, Ereignisse für den Zugriff auf Objekte des Hauptfensters Ihrer Anwendung einzurichten. Sie können sie einfach auf dem Popup-Code aufrufen und damit fertig sein:

((MainWindow)Application.Current.MainWindow).textBox1.Text = "Some text"; 
Verwandte Themen