代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

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

  •  2
  • Edward Tanguay  · 技术社区  · 16 年前

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

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

    alt text

    这是 :

    <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();
    }
    

    当我弹出新窗口时,我必须做什么才能使主应用程序保持在最靠后的位置?

    2 回复  |  直到 6 年前
        1
  •  12
  •   Martin Liversage    16 年前

    要在视觉层次结构中排列窗口,必须设置 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();
    }
    
        2
  •  6
  •   jhewlett    12 年前

    我也有同样的问题,但在WinForms窗体中托管WPF窗口。在这种情况下,主人给了我一部分帮助,但偶尔它还是落后了。

    除此之外,我最后做的事情是把电线连接起来 Loaded WPF窗口上的事件并调用 Activate

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