WPF创建同级窗口并关闭当前窗口

时间:2011-07-12 22:52:16

标签: c# 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()它会成为当前窗口的对话框,这意味着在新窗口关闭之前当前窗口不会关闭,我也不想要这样。

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

如果我理解你要做什么,你想要关闭当前窗口并将其替换为MyNewWindow,它是原始窗口父窗口(可能是应用程序的主窗口)的窗口的子窗口。

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

    mnw.Owner = this.Owner;

而不是调用GetWindow,它会返回当前的Window实例。 GetWindow的目的是获取包含一些其他UIElement的Window,就像在树下面的Button一样。传入Window实例时,只需返回传入的内容即可。

答案 2 :(得分:1)

调用ShowDialog()块。这意味着,该方法仅在mnw关闭时返回,并且仅在原始窗口关闭时返回。

如果您将其更改为Show(),则只要在原始窗口上调用mnwClose()就会关闭。因为Window.GetWindow(this)会返回this。因此,您将所有者设置为this,当您关闭this时,mnw也会关闭。这让我们:

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

此代码似乎对我有用。