2016-10-01 91 views
0

有人请为我说明如何设置一个这样的逻辑:两个窗口之间的wpf事件

我有一个WPF控件。当按下按钮时,它执行两个可能的事情之一。答:它检查是否已加载不同的WPF窗口。如果是,它会触发该窗口的Print方法。 B.它检查是否加载了不同的WPF窗口。如果不是,则实例化该窗口,然后触发其Print方法。

我很难理解两个WPF控件/ Windows之间的事件系统。对我来说这是一个相对较新的东西,所以如果有人通过这个来向我走,我会很感激。

Ps。这不是一项家庭作业,而是我的一项新爱好。如果它是一个完全noob问题,然后只是指向我的资源,所以我可以教育自己。

干杯!

+0

你提的问题是过于宽泛。你需要提供一个很好的[mcve],清楚地说明你的场景。我会指出你似乎错误地看待问题。也就是说,打印命令应该属于知道如何打印的视图模型,并且您不必导航事件系统就可以在视图模型上调用要打印的命令。 WPF中的用户界面和事件路由用于与视图进行交互,后者又与视图模型进行交互。视图本身不应该实现与用户交互直接相关的功能。 –

+0

如何使用观察者 - 订户设计模式为您的情况。我认为这将是一个很好的解决方案这 –

回答

1

首先,您将检查打开的新Window是您需要的方式是什么?

你可以通过比较其Handle或他们的Type(:窗口公共类MyWindowWithPrintMethod)做到这一点。

可以有多种方式来做到这一点。

我建议我简单的方法,专注于WPF方式,以最简单的方式解决您的目的。

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

answer从这个question约2个窗事件可能帮助:

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"); 
    } 
} 

子窗口

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(); 
    } 
} 

上面的代码显示了如何从一个窗口中设置一个事件到另一个。但是,您可能只想在其他窗口中调用方法。对于example

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

如果你下定决心坚持的事件,那么你应该在WPF routed events阅读起来。

+0

如何使用观察者 - 订户设计模式为您的情况。我认为这将是一个很好的解决方案 –