2011-07-12 121 views
3

我需要的是我的窗口类中的这样一个事件处理程序。WPF创建兄弟窗口并关闭当前窗口

void someEventHandler(object sender, RoutedEventArgs e) 
{ 
    MyNewWindow mnw = new MyNewWindow(); 
    mnw.Owner = Window.GetWindow(this); 
    mnw.ShowDialog(); 
    this.Close(); 
} 

Window.GetWindow(this)返回当前窗口的父窗口。

我曾经想过,当新窗口的所有者是当前窗口的父窗口时,它会等待父窗口;而不是现在的那个。但它没有那样工作。当前窗口等待新的执行并且仅在之后关闭。

如果我使用Show()而不是ShowDialog()出于某种原因,窗口根本不显示。

也许我需要一些委托方法,但我不知道从哪里开始。

编辑:我想我需要改善未来的参考问题: 新窗口应该是一个对话框到父窗口。如果我使用Show()父窗口变得可访问,我不希望这样。如果我使用ShowDialog(),它会变成当前窗口的对话框,这意味着当前窗口在新窗口关闭之前不会关闭,我也不希望这样做。

回答

5

关闭一个窗口会导致它拥有的任何窗口to be closed

如果您只是想让所有者窗口不可见,请尝试此操作;

void someEventHandler(object sender, RoutedEventArgs e) 
{ 
    MyNewWindow mnw = new MyNewWindow(); 
    mnw.Owner = this; 
    this.Hide(); // not required if using the child events below 
    mnw.ShowDialog(); 
} 

你可能会希望挂钩的,当你关闭根据您的要求子窗口,采取相应的行动父窗口中的一些事件。

编辑

也许你可以控制(多个父)从孩子的藏身;

void OnLoad(object sender, RoutedEventArgs e) 
{ 
    this.Owner.Hide(); 
} 
void Closed(object sender, RoutedEventArgs e) 
{ 
    this.Owner.Show(); 
} 
+0

在父窗口中处理这个问题是最简单的解决方案。但子窗口可以从其他各种窗口调用,这使得事情变得复杂。我需要修改每个父窗口中的事件处理程序,而我不希望这样。 – Kta

+0

btw。在ShowDialog()之前调用this.Hide()确保了我的解决方案。窗口没有关闭,但至少用户认为是这样:) ty – Kta

1

如果我知道你想关闭当前窗口,并用MyNewWindow是,这是原始窗口的父窗口(可能是应用程序的主窗口)的子更换你想要做什么。

要做到这一点,你应该使用:

mnw.Owner = this.Owner; 

而不是调用GetWindow,它给你回当前窗口实例。 GetWindow的目的是获取包含一些其他UIElement的Window,例如树中较远的Button。当传入一个Wi​​ndow实例时,您只需取回通过的内容。

+0

你说得对。但是我希望新窗口显示为主窗口的对话框。 Show()和ShowDialog()都不提供这种方式。 – Kta

1

调用ShowDialog()块。也就是说,该方法仅在mnw关闭时才返回,只有原始窗口关闭。

如果将其更改为Show(),那么在原始窗口中呼叫Close()后,将立即关闭mnw。因为Window.GetWindow(this)返回this。因此,您将所有者设置为this,并且当您关闭this时,mnw也会关闭。这使我们与:

MyNewWindow mnw = new MyNewWindow(); 
mnw.Owner = this.Owner; // may not be necessary 
mnw.Show(); 
this.Close(); 

此代码似乎为我工作。

+0

当我调用Show()时,父窗口变为可访问。我想让新窗口成为父窗口的对话框。 – Kta