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
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();
}
}
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
}
}
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
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. –
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";
- 1. Variable im untergeordneten Fenster erhält keinen Wert vom übergeordneten Element
- 2. JavaScript: Ausnahme im übergeordneten Fenster geworfen tritt im untergeordneten Fenster
- 3. WPF-Besitzerfenster über dem untergeordneten Fenster
- 4. ShowDialog() hinter dem übergeordneten Fenster
- 5. Wie übertrage ich die Daten vom Popup-Fenster zum übergeordneten Fenster?
- 6. So navigieren Sie vom übergeordneten Fenster zum Popup-Fenster mit Knoten js Night Watch
- 7. Capture WM_MOUSEMOVE Ereignisse im übergeordneten Fenster
- 8. Wie zeige ich einen Wert vom Children-Fenster zum Parent-Fenster in Python Tkinter an?
- 9. Inject iframe JavaScript-Code zum übergeordneten Fenster
- 10. Erneutes Laden des übergeordneten Fensters aus dem untergeordneten Fenster
- 11. C#: Eingabe vom inaktiven Fenster senden
- 12. Deaktivieren aller außer einem untergeordneten Steuerelement in einem WPF-Fenster
- 13. AngularJS - Verweise auf $ rootscope im untergeordneten Fenster
- 14. Knoten webkit- Iframe-Mausereignisse vom übergeordneten Fenster erfassen
- 15. WPF-übergeordnetes Element (Fenster)
- 16. Standard-Fenster-Instanz in WPF
- 17. WPF-Fenster vorladen
- 18. Übergeben des Ereignisses vom übergeordneten zum untergeordneten Element (Polymer)
- 19. WPF öffnet EXE-Programm in WPF-Fenster
- 20. WIX Installateur - pass Variable zum nächsten Fenster
- 21. Transparente PNG in WPF-Fenster
- 22. WPF: Vererbt von Fenster
- 23. Zwei WPF-Fenster gleichzeitig verschieben?
- 24. WPF übergeordnete Fenster
- 25. WPF deaktivieren Fenster verschieben
- 26. WPF Fenster Schatteneffekt
- 27. WPF-Fenster komplett schwarz
- 28. WPF: Benutzerdefiniertes Fenster
- 29. WPF - Fenster nicht
- 30. WPF-Fenster wird schwarz
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. –
Arbeitete einwandfrei. Vielen Dank! –
was ist, wenn ich zwei Saiten habe ?? Wie schreibe ich Code? 'popup.Check + = value => label.Content = Wert, label2.Content = Wert;' ?? –