1

Instead of using a traditional splash screen, I want to display a login window to allow the user to enter their credentials. Meanwhile, in the background, I want to initialize the app, then load the main window. The problem is that the login window is covered up by the main window once shown.

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

The login window is made the main window from the start. My assumption was that by setting the ApplicationWindow's owner to the login window, the login window would remain on top. If I'm doing it wrong, is there a way to achieve what I want? The topmost flag works but then the window is, well, topmost, which is undesirable.

Dan
  • 1,215
  • 1
  • 10
  • 22

1 Answers1

1

Suppose you have a 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>

with code behind:

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

Then you can initialize your MainWindow while showing the login dialog.

AND you load the MainWindow as normal via StartUpUri in App.xaml

  • 1
    Thanks for your help. My issue was that I was hoping to construct the MainWindow with the parameters it needed. Also, I was hoping to understand the whole 'Owner' thing a little more. In the end your solution might be the best. – Dan Oct 22 '16 at 16:38
  • Thanks for bringing me back down to earth. What I was trying to engineer was way over complicated. – Dan Oct 23 '16 at 03:19