如何让 WPF Window 保持在另一个之上?

How do I get WPF Window to stay on top of another?

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

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

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

假设您有一个主窗口:

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

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

并且您在 App.xaml

中通过 StartUpUri 正常加载 MainWindow