【问题标题】:Need to know when a non-modal window has closed需要知道非模态窗口何时关闭
【发布时间】:2012-01-18 12:30:06
【问题描述】:

我已经从 parentWindow(非模态)打开了 childwindow - 实现“等待”以便 parentWindow 知道 childWindow 何时关闭的最佳方法是什么?由于几个原因,我不能使用 showDialog()。我尝试了一个while循环(测试childWindow的可见性属性),但它只是中断(没有例外-但只是不打开childWindow)。是多线程的情况吗??

【问题讨论】:

  • 为什么不能使用模态对话框?

标签: c# wpf window modal-dialog


【解决方案1】:

实现“等待”的最佳方法是什么? 会知道 childWindow 何时关闭?

您可以使用事件,以便在子窗口关闭时通知父窗口。例如,there is the Closed event

Window childWindow = new ....
childWindow.Closed += (sender, e) =>
    {
        // Put logic here
        // Will be called after the child window is closed
    };
childWindow.Show();

【讨论】:

  • 非常感谢肯。正是我正在寻找的。出于好奇 - 这是使用 lambda 编写的吗?
  • 是的,它是 lambda 表达式。比标准事件处理程序更简洁直接,但另一方面,您无法使用 -= 运算符轻松分离事件。
  • 我明白了。非常感谢。与我在 lambda 上所做的修订很好地联系在一起。我仍然对 sender 和 e 的来源感到很困惑,但我会掌握的。
  • sendere 是传递给事件处理程序的参数。 lambda 的语法可能看起来有点奇怪,但它与普通事件处理程序完全相同。每个事件处理程序始终具有相同的参数:sender 类型为 objecte 继承自 EventArgssender 包含对引发事件的实例的引用。在您的情况下,它将是对 childWindow 对象的引用。 e 将包含一个 EventArgs 实例,但由于此特定事件不使用任何参数,因此对您来说毫无用处。
  • 实际上,(object sender, EventArgs e) => 它完全有效;) 通常不会这样编写,因为它不是必需的:C# 3.0(不适用于 C# 2.0)编译器(和 Visual Studio for Intellisense)是足够聪明,可以做所谓的类型推断。这允许编译器根据上下文知道参数的类型。您可以尝试在以下 MSDN 文章中搜索类型推断:msdn.microsoft.com/en-us/library/orm-9780596527570-03-04.aspx
【解决方案2】:

我想你可以用这个:

    public ShowChild()
    {
        childWindow child = new childWindow();
        child.Closed += new EventHandler(child_Closed);
        child.Show();
    }

    void child_Closed(object sender, EventArgs e)
    {
        // Child window closed
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2011-03-03
    • 1970-01-01
    相关资源
    最近更新 更多