【问题标题】:How do I get WPF Window to stay on top of another?如何让 WPF 窗口保持在另一个之上?
【发布时间】:2025-12-28 23:20:20
【问题描述】:

我想显示一个登录窗口以允许用户输入他们的凭据,而不是使用传统的启动屏幕。同时,在后台,我想初始化应用程序,然后加载主窗口。问题是登录窗口一旦显示就被主窗口覆盖了。

private void App_OnStartup(object sender, StartupEventArgs e)
{
    Current.MainWindow = new LoginWindow();
    Current.MainWindow.Show();

    Task.Run(() => { /*do app startup background stuff*/ }).ContinueWith(t =>
    {
       var appWindow = new ApplicationWindow();
       appWindow.Show();
       Current.MainWindow.Owner = appWindow;

    }, TaskScheduler.FromCurrentSynchronizationContext());

登录窗口从一开始就是主窗口。我的假设是,通过将 ApplicationWindow 的所有者设置为登录窗口,登录窗口将保持在顶部。如果我做错了,有没有办法实现我想要的?最上面的标志有效,但是窗口是最上面的,这是不可取的。

【问题讨论】:

    标签: c# wpf window owner


    【解决方案1】:

    假设你有一个主窗口:

    <Window x:Class="SO40189046.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:SO40189046"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
        <TextBlock Name="TimeText" />
      </Grid>
    </Window>
    

    后面有代码:

    using System;
    using System.Threading;
    using System.Windows;
    
    namespace SO40189046
    {
      /// <summary>
      /// Interaction logic for MainWindow.xaml
      /// </summary>
      public partial class MainWindow : Window
      {
        public MainWindow()
        {
          InitializeComponent();
          Loaded += MainWindow_Loaded;
    
          // Background thread initializing the MainWindow
          ThreadPool.QueueUserWorkItem((state) =>
          {
            for (int i = 0; i < 10; i++)
            {
              Dispatcher.Invoke(() =>
              {
                TimeText.Text = DateTime.Now.ToString();
              });
              Thread.Sleep(1000);
            }
          });
    
        }
    
        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
    
          LoginWindow login = new LoginWindow();
          login.Owner = App.Current.MainWindow;
          login.WindowStartupLocation = WindowStartupLocation.CenterOwner;
          if (!login.ShowDialog().GetValueOrDefault())
          {
            Close();
          }
        }
      }
    }
    

    然后您可以在显示登录对话框的同时初始化您的 MainWindow。

    并且您通过 App.xaml 中的 StartUpUri 正常加载 MainWindow

    【讨论】:

    • 感谢您的帮助。我的问题是我希望用它需要的参数来构造 MainWindow。另外,我希望能更多地了解整个“所有者”的事情。最后,您的解决方案可能是最好的。
    • 感谢您将我带回地球。我试图设计的东西过于复杂。