web-dev-qa-db-fra.com

WPF montrant la boîte de dialogue avant la fenêtre principale

Comment peut-on afficher une fenêtre de dialogue (par exemple, connexion/options, etc.) avant la fenêtre principale?

Voici ce que j'ai essayé (apparemment a déjà fonctionné , mais plus maintenant):

[~ # ~] xaml [~ # ~] :

<Application ...
    Startup="Application_Startup">

Application :

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

Résultat : myDialogWindow est affiché en premier. Lorsqu'il est fermé, le Window1 est affiché comme prévu. Mais lorsque je ferme Window1, l'application ne se ferme pas du tout.

42
Ciantic

Voici la solution complète qui a fonctionné pour moi:

Dans App.xaml, je supprime les éléments StartupUri et j'ajoute un gestionnaire 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>

Dans App.xaml.cs, je définis le gestionnaire comme suit:

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

D'accord s'excuse, voici la solution:

Ma question d'origine fonctionnait presque, une seule chose à ajouter, supprimez le StartupUri de l'Application XAML et après cela, ajoutez la Afficher à la fenêtre principale.

C'est:

<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">

Ci-dessus, StartupUri supprimé.

Ajoutez myMainWindow.Show () aussi:

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 définit App.Current.MainWindow à la première fenêtre ouverte. Si vous avez le contrôle sur le constructeur de fenêtre secondaire, définissez simplement App.Current.MainWindow = Null Là. Une fois votre fenêtre principale construite, elle sera affectée au App.Current.MainWindow propriété comme prévu sans aucune intervention.

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

Si vous n'y avez pas accès, vous pouvez toujours définir MainWindow dans le constructeur de la fenêtre principale.

3
James Durda

Si vous mettez Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown; dans le constructeur de la boîte de dialogue et ajoutez

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

dans la classe de dialogue, vous n'avez pas à vous soucier d'apporter des modifications au comportement par défaut de l'application. Cela fonctionne très bien si vous souhaitez simplement insérer un écran de connexion dans une application déjà existante sans modifier les procédures de démarrage.

3
Patrick

Vous souhaitez donc afficher une fenêtre, puis une autre, mais fermer l'application lorsque cette fenêtre est fermée? Vous devrez peut-être définir ShutdownMode sur OnMainWindowClose et définir MainWindow sur Window1, le long des lignes ok:

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

ici, faites comme ça. cela changera réellement votre fenêtre principale et fonctionnera correctement sans avoir à modifier les paramètres de votre objet d'application.

assurez-vous de supprimer le gestionnaire d'événements pour le démarrage de l'application et de définir votre StartupUri dans votre fichier 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