Как заставить окно WPF оставаться поверх другого?

Вместо использования традиционного экрана-заставки я хочу отобразить окно входа, чтобы пользователь мог ввести свои учетные данные. Между тем, в фоновом режиме я хочу инициализировать приложение, а затем загрузить главное окно. Проблема в том, что окно входа в систему закрыто основным окном после его отображения.

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 в окно входа в систему, окно входа в систему останется сверху. Если я делаю это неправильно, есть ли способ добиться того, чего я хочу? Самый верхний флаг работает, но тогда окно оказывается самым верхним, что нежелательно.


person Dan    schedule 22.10.2016    source источник


Ответы (1)


Предположим, у вас есть MainWindow:

<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 при отображении диалогового окна входа в систему.

И вы загружаете MainWindow как обычно через StartUpUri в App.xaml

person Community    schedule 22.10.2016
comment
Спасибо за вашу помощь. Моя проблема заключалась в том, что я надеялся построить MainWindow с необходимыми параметрами. Кроме того, я надеялся немного лучше понять всю эту штуку с «Владельцем». В конце концов, ваше решение может быть лучшим. - person Dan; 22.10.2016
comment
Спасибо, что вернул меня на землю. То, что я пытался спроектировать, было слишком сложным. - person Dan; 23.10.2016