2016-10-22 73 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

假設你有一個主窗口:

<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

+1

感謝您的幫助。我的問題是我希望用它所需的參數構造MainWindow。另外,我希望更多地瞭解整個「所有者」的事情。最終你的解決方案可能是最好的。 – Dan

+0

謝謝你讓我回到地球。我試圖設計的是複雜的方式。 – Dan

相關問題