2016-10-22 9 views
0

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

ответ

0

Предположим, у вас есть 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

+1

Спасибо за вашу помощь. Моя проблема заключалась в том, что я надеялся построить MainWindow с необходимыми параметрами. Кроме того, я надеялся понять все «Владелец» еще немного. В конечном итоге ваше решение может быть лучшим. – Dan

+0

Спасибо, что вернул меня на землю. То, что я пытался создать, было слишком сложным. – Dan