2016-10-01 3 views
0

Kann jemand bitte mir zeigen, wie eine Logik wie folgt einzurichten:wpf Ereignisse zwischen zwei Fenstern

Ich habe eine WPF-Steuerelement. Wenn eine Taste gedrückt wird, macht sie eines der zwei möglichen Dinge.

A. Es prüft, ob ein anderes WPF-Fenster geladen wurde. Wenn dies der Fall ist, wird die Druckmethode dieses Fensters ausgelöst. B. Es prüft, ob ein anderes WPF-Fenster geladen wurde. Ist dies nicht der Fall, wird das Fenster instanziiert und anschließend die Print-Methode ausgelöst.

Ich habe Schwierigkeiten, das Ereignissystem zwischen zwei WPF Controls/Windows zu verstehen. Es ist eine relativ neue Sache für mich, also würde ich mich freuen, wenn mich jemand damit durchgehen würde.

Ps. Dies ist keine Hausaufgabe, sondern ein neues Hobby von mir. Wenn es eine völlig neue Frage ist, dann zeige mich einfach auf eine Ressource, damit ich mich selbst weiterbilden kann.

Prost!

+0

Ihre Frage zu breit ist. Sie müssen ein gutes [mcve] bereitstellen, das Ihr Szenario deutlich veranschaulicht. Ich werde darauf hinweisen, dass Sie das Problem scheinbar falsch sehen. Das heißt, der Druckbefehl sollte zu einem Ansichtsmodell gehören, das zu drucken weiß, und Sie sollten nicht durch das Ereignissystem navigieren müssen, um einen Befehl auf dem Ansichtsmodell zum Drucken aufzurufen. Die Benutzeroberfläche und das Ereignis-Routing in WPF dienen dem Benutzer zur Interaktion mit der Ansicht, die wiederum mit den Ansichtsmodellen interagiert. Die Ansicht selbst sollte keine Funktionen implementieren, außer denjenigen, die direkt mit der Interaktion des Benutzers zusammenhängen. –

+0

Wie wäre es mit Observer - Subscriber Design Pattern für Ihren Fall. Ich denke, es wird eine gute Lösung für diese –

Antwort

1

Zuerst, was ist die Art und Weise, wie Sie überprüfen, ob neue Window geöffnet ist, was Sie brauchen?

Sie können dies tun, indem ihre Handle oder ihre Type (public class MyWindowWithPrintMethod: Fenster) zu vergleichen.

Es kann mehrere Möglichkeiten geben, dies zu tun.

Ich schlage meine einfache Art vor, die sich auf den WPF-Weg konzentriert, um Ihren Zweck auf möglichst einfache Weise zu lösen.

MyWindowWithPrintMethod obj_MyWindowWithPrintMethod; 
    private void btnNewWindow_Click(object sender, RoutedEventArgs e) 
    { 
     obj_MyWindowWithPrintMethod = new MyWindowWithPrintMethod(); 
     obj_MyWindowWithPrintMethod.Show(); 
    } 

    private void btnCheckNewWindow_Click(object sender, RoutedEventArgs e) 
    { 
     WindowInteropHelper tgtWindow = new WindowInteropHelper(obj_MyWindowWithPrintMethod); 

     foreach (Window w in Application.Current.Windows) 
     { 
      // Compare Handle 
      WindowInteropHelper wih = new WindowInteropHelper(w); 
      if (wih.Handle == tgtWindow.Handle) 
      { 
      ((MyWindowWithPrintMethod)w).Print(); 
      } 

      // Compare Type 
      if (w.GetType() == typeof(MyWindowWithPrintMethod)) 
      { 
      ((MyWindowWithPrintMethod)w).Print(); 
      } 
     } 
    } 

MyWindowWithPrintMethod.cs

 public class MyWindowWithPrintMethod : Window 
    { 
     public void Print() 
     { 
      MessageBox.Show("Print invoked !"); 
     } 
    } 
0

Diese answer von diesem question über Ereignisse aus 2 Fenstern kann helfen:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     this.Loaded += new RoutedEventHandler(MainWindow_Loaded); 
    } 

    void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     Child childWindow = new Child(); 
     childWindow.MyEvent += new EventHandler(childWindow_MyEvent); 

     childWindow.ShowDialog(); 
    } 

    void childWindow_MyEvent(object sender, EventArgs e) 
    { 
     // handle event 
     MessageBox.Show("Handle"); 
    } 
} 

Kinder Fenster

public partial class Child : Window 
{ 
    // define event 
    public event EventHandler MyEvent; 

    protected void OnMyEvent() 
    { 
     if (this.MyEvent != null) 
      this.MyEvent(this, EventArgs.Empty); 
    } 

    public Child() 
    { 
     InitializeComponent(); 

     this.Loaded += new RoutedEventHandler(Child_Loaded); 
    } 

    void Child_Loaded(object sender, RoutedEventArgs e) 
    { 
     // call event 
     this.OnMyEvent(); 
    } 
} 

Der obige Code zeigt, wie ein Ereignis von einem Fenster zum anderen einzurichten . Vielleicht möchten Sie stattdessen einfach eine Methode in diesem anderen Fenster aufrufen. Für example:

public void AddNewUser() 
{ 
    Window2 window = new Window2(); 
    if (window.ShowDialog() == true) 
    { 
     // Update DataGrid 
     RefreshDataGrid(); 
    } 
} 

Wenn Sie entschlossen sind, mit Ereignissen zu bleiben, dann sollten Sie oben auf WPF routed events lesen.

+0

Wie wäre es mit Observer - Subscriber Design Pattern für Ihren Fall.Ich denke, es wird eine gute Lösung dafür sein –

Verwandte Themen