如何让WPF弹出窗口不被隐藏在主应用程序后面?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让WPF弹出窗口不被隐藏在主应用程序后面?相关的知识,希望对你有一定的参考价值。

在WPF应用程序中,我有弹出窗口实例的按钮。

  • 我单击第一个按钮,第一个窗口在主应用程序前面正确弹出。
  • 我单击第二个按钮,第二个窗口在主应用程序前面正确弹出。但是,第一个窗口现在移动到主应用程序后面。这是令人困惑和意外的,因为它经常在主应用程序的中间,因此它似乎消失,直到用户移动主应用程序以发现它隐藏在后面。

alt text

这是XAML:

<Window x:Class="TestPopupFix.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="600" Width="800">
    <StackPanel>
        <Button Content="Open first popup" Click="Button_OpenFirst"/>
        <Button Content="Open second popup" Click="Button_OpenSecond"/>
    </StackPanel>
</Window>

而这背后的代码:

private void Button_OpenFirst(object sender, RoutedEventArgs e)
{
    Window window = new Window();
    TextBlock tb = new TextBlock();
    tb.Text = "This is the first window.";
    window.Content = tb;
    window.Width = 300;
    window.Height = 300;
    window.Show();
}

private void Button_OpenSecond(object sender, RoutedEventArgs e)
{
    Window window = new Window();
    TextBlock tb = new TextBlock();
    tb.Text = "This is the second window.";
    window.Content = tb;
    window.Width = 300;
    window.Height = 300;
    window.Show();
}

当我弹出新窗口时,我需要做些什么来使主应用程序保持最后的状态?

答案

要在可视层次结构中排列窗口,您必须将子窗口的Owner属性设置为父窗口。

您可以阅读更多关于the Owner property on MSDN的信息。

您应该将代码更改为类似于此的代码:

Window parentWindow;

private void Button_OpenFirst(object sender, RoutedEventArgs e)
{
  this.parentWindow = new Window();
  this.parentWindow.Owner = this;
  this.parentWindow.Show();
}

private void Button_OpenSecond(object sender, RoutedEventArgs e)
{
  Window childWindow = new Window();
  childWindow.Owner = this.parentWindow;
  childWindow.Show();
}
另一答案

我遇到了同样的问题,但是在WinForms表单中托管了一个WPF窗口。在这种情况下,设置所有者让我成为了我的一部分,但偶尔它仍然落后。

我最后做的除了那个是在WPF窗口上连接Loaded事件并调用Activate如下:

_window.Loaded += (s, e) => _window.Activate();

以上是关于如何让WPF弹出窗口不被隐藏在主应用程序后面?的主要内容,如果未能解决你的问题,请参考以下文章

如何在文件后面没有代码的情况下移动无边框 wpf 窗口

如何让 WPF 窗口停留在某个窗口的前面而不是最上面?

wpf 如何让弹出窗口总在屏幕范围之内?

Windows 安全弹出窗口出现在主应用程序窗口后面

C#窗口切换问题:如何切换回主窗体

wpf 如何让当前窗口隐藏