两个窗口之间的wpf事件

时间:2016-10-01 22:44:05

标签: c# wpf

有人可以向我说明如何设置这样的逻辑:

我有一个WPF控件。按下按钮时,它会执行两个可能的操作之一。

一个。它检查是否已加载不同的WPF窗口。如果是,则触发该窗口的Print方法。 B.它检查是否已加载不同的WPF窗口。如果不是,则实例化该窗口,然后触发其Print方法。

我很难理解两个WPF控件/ Windows之间的事件系统。对我来说这是一个相对较新的事情,所以如果有人带我走过这件事,我将不胜感激。

聚苯乙烯。这不是家庭作业,而是我的新爱好。如果它是一个完全noob的问题,那么请指出我的资源,这样我就可以自学。

干杯!

2 个答案:

答案 0 :(得分:1)

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

您可以通过比较他们的Handle或他们的Type公共类MyWindowWithPrintMethod:Window )来实现此目的。

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

我建议以简单的方式,专注于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 !");
         }
     }

答案 1 :(得分:0)

来自此answerquestion来自2个窗口的事件可能有所帮助:

def main():
mark = 0
file_name = input('Enter the name of the file: ')
lst = []
for num in open(file_name):
    lst.append(num.strip())
print(lst)
lst = sort(lst, mark)
print(lst)


def sort(lst, mark):
while mark <= len(lst) - 1:
    minval = lst[mark]
    for i in range(len(lst)):
        if lst[i] > minval:
            lst[i], lst[mark] = lst[mark], lst[i]
    minval = lst[mark]
    mark += 1
    sort(lst, mark)
return lst

main()

子窗口

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

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

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

如果您决定坚持使用事件,那么您应该阅读WPF routed events