如何从模态窗口调用主WPF窗口的方法?

9

如何从模态窗口调用主WPF窗口的方法?

(实际上,当我关闭某个模态窗口时,我想启动MainWindow.xaml.cs的一些计时器。)

谢谢!

5个回答

17

你可以在打开第二个窗口之前将主窗口指定为其所有者,然后从模态窗口调用Owner属性,将其强制转换为MainWindow对象,这样就可以执行该方法。

// Code in main window
ModalWindow window = new ModalWindow();
window.Owner = this; 
window.ShowDialog()

//Code on the modal window
var myObject = this.Owner as MainWindow;
myObject.MyMethod(); // Call your method here.

我得到了这个错误信息:"无法将 Owner 属性设置为之前未显示的窗口"。看来 window.Owner 不能先于 ShowDialog 函数调用。 - pzogr

5
public class ModalWindow : Window
{
    private MainWindow _parent;
    public ModalWindow(MainWindow parent)
    {
        _parent = parent;
        Owner = parent;
    }

    void CallParent()
    {
        _parent.Call();
    }
}

我认为这种模式是代码异味。
如果你的目标是将信息从模态窗口传递给父级,请在模态窗口上公开属性,并在关闭后读取这些值并在父级中执行必要的操作。
如果你的目标是将信息从父级传递到模态窗口,则在调用ShowDialog()之前将其传递到构造函数或公共属性中。

2

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

您可以重载模态窗口的构造函数,以便可以传递对该函数或主窗口的引用。或者,在该窗口中添加一个属性。

您还可以在显示模态窗口的主窗口代码的下一行启动计时器。


2
  • 如果此模态窗口将从MainWindow打开,像这样:

    modalWindow.ShowDialog()

    只需在此调用之后添加代码,它将在模态窗口关闭后执行。

  • 如果模态窗口是从其他地方打开的,但在关闭时应运行完全不相关的代码,则可以使用例如CommandsRelayCommand(一种直接委托调用)。

希望这可以帮到你。


0
您可以将事件处理程序附加到模态对话框的“Closing”事件上,当对话框触发此事件时,该处理程序将在主程序中执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接