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

関連する問題