web-dev-qa-db-ja.com

メインウィンドウの前にダイアログを表示するWPF

メインウィンドウの前にダイアログウィンドウ(ログイン/オプションなど)を表示するにはどうすればよいですか?

これが私が試したものです(明らかに かつて機能したことがある ですが、もうそうではありません):

[〜#〜] xaml [〜#〜]

<Application ...
    Startup="Application_Startup">

アプリケーション

public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        Window1 myMainWindow = new Window1();
        DialogWindow myDialogWindow = new DialogWindow();
        myDialogWindow.ShowDialog();
    }
}

結果:myDialogWindowが最初に表示されます。閉じられると、期待どおりWindow1が表示されます。しかし、Window1を閉じると、アプリケーションがまったく閉じません。

42
Ciantic

これが私のために働いた完全な解決策です:

App.xamlStartupUriを削除し、Startupハンドラーを追加します。

<Application x:Class="MyNamespace.App"
             xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
             Startup="ApplicationStart">
</Application>

App.xaml.csで、ハンドラーを次のように定義します。

public partial class App
{
    private void ApplicationStart(object sender, StartupEventArgs e)
    {
        //Disable shutdown when the dialog closes
        Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;

        var dialog = new DialogWindow();

        if (dialog.ShowDialog() == true)
        {
            var mainWindow = new MainWindow(dialog.Data);
            //Re-enable normal shutdown mode.
            Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
            Current.MainWindow = mainWindow;
            mainWindow.Show();
        }
        else
        {
            MessageBox.Show("Unable to load data.", "Error", MessageBoxButton.OK);
            Current.Shutdown(-1);
        }
    }
}
75
Gleno

申し訳ありませんが、これが解決策です:

私の元の質問はほぼ機能しましたが、1つ追加するだけです。アプリケーションXAMLからStartupUriを削除し、その後、メインウィンドウに表示を追加します。

あれは:

<Application x:Class="DialogBeforeMainWindow.App"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    Startup="Application_Startup">

上記のStartupUriは削除されました

追加myMainWindow.Show()も追加:

public partial class App : Application
{

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        Window1 myMainWindow = new Window1();
        DialogWindow myDialogWindow = new DialogWindow();
        myDialogWindow.ShowDialog();
        myMainWindow.Show();
    }

}
6
Ciantic

WPFはApp.Current.MainWindowを最初に開いたウィンドウに設定します。セカンダリウィンドウコンストラクターを制御できる場合は、App.Current.MainWindow = Nullを設定します。メインウィンドウが作成されると、何もしなくても期待どおりにApp.Current.MainWindowプロパティに割り当てられます。

public partial class TraceWindow : Window
{
    public TraceWindow()
    {
        InitializeComponent();
        if (App.Current.MainWindow == this)
        {
            App.Current.MainWindow = null;
        }
    }
}

アクセス権がない場合でも、メインウィンドウのコンストラクター内でMainWindowを設定できます。

3
James Durda

あなたが置く場合Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;ダイアログのコンストラクタに追加し、

protected override void OnClosed(EventArgs e) {
    base.OnClosed(e);
    Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
}

ダイアログクラスに入ると、アプリケーションのデフォルトの動作に変更を加えることを心配する必要はありません。これは、起動手順を調整せずに、ログイン画面を既存のアプリにスナップしたい場合に最適です。

3
Patrick

つまり、あるウィンドウを表示し、次に別のウィンドウを表示したいのですが、そのウィンドウが閉じているときにアプリを閉じますか? ShutdownMode をOnMainWindowCloseに設定し、 MainWindow をWindow1に設定する必要がある場合があります。

Window1 myMainWindow = new Window1();
Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
Application.Current.MainWindow = myMainWindow;
DialogWindow myDialogWindow = new DialogWindow();
myDialogWindow.ShowDialog();
2
Steven Robbins

ここでは、このようにします。これにより、メインウィンドウが実際に変更され、アプリケーションオブジェクトの設定を変更しなくても正しく動作します。

アプリケーションの起動用のイベントハンドラーを削除し、startupUriをapp.xamlファイルに設定してください。

public partial class App : Application
{
   bool init = false;
   protected override void OnActivated(EventArgs e)
   {
      base.OnActivated(e);
      if (!init)
      {
         this.MainWindow.Closing += new System.ComponentModel.CancelEventHandler(MainWindow_Closing);
         init = true;
      }
   }

   void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
   {
      Window toClose = this.MainWindow;
      this.MainWindow = new Window2();
      this.MainWindow.Show();
   }
}
0
Muad'Dib