【问题标题】:Sending event between 2 WPF windows在 2 个 WPF 窗口之间发送事件
【发布时间】:2011-10-26 09:41:59
【问题描述】:

我有两个 WPF 窗口。一个是主窗口,另一个是一些配置窗口。 我希望配置窗口发送和事件到主窗口。 知道我是如何完成它的吗?

这就是我创建和打开配置窗口的方式:

 private void MenuItem_Click(object sender, RoutedEventArgs e)
    {
        ConfigPage Confwin= new ConfigPage();
        Confwin.Owner = this;
        Confwin.Show();
    }

【问题讨论】:

  • 谁在创建配置窗口?你在使用 MVVM 吗?

标签: c# wpf events


【解决方案1】:

您可以在子窗口类中定义任何事件并在显示窗口之前订阅它。

主窗口

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

【讨论】:

  • 非常漂亮和干净的方式。也非常简单的代码来理解事件处理的基本结构。来自我的 +1...
  • 还想快速表示感谢,这有助于我了解设置自己的事件处理程序的基础知识,另一个 +1。
【解决方案2】:

您应该使用弱事件模式。如果您使用PrismMVVMLight,它是内置的。

否则,您必须自己实现它:msdn

这样做的原因是它将配置窗口与主窗口分离。
它们不应该相互了解,以便配置窗口可重用(并且您应用中的任何活动对象也可以侦听该事件)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2015-05-02
    • 2014-12-28
    • 1970-01-01
    相关资源
    最近更新 更多