Créer et gérer des boîtes de dialogue modalesCreating and Managing Modal Dialog Boxes

Lorsque vous créez une boîte de dialogue modale à l’intérieur de Visual Studio, vous devez vous assurer que la fenêtre parente de la boîte de dialogue est désactivée pendant que la boîte de dialogue s’affiche, puis réactiver la fenêtre parente après la fermeture de la boîte de dialogue.When you create a modal dialog box inside Visual Studio, you must make sure that the parent window of the dialog box is disabled while the dialog box is displayed, then re-enable the parent window after the dialog box is closed. Si vous ne le faites pas, vous pouvez recevoir l’erreur : « Microsoft Visual Studio ne peut pas arrêté, car une boîte de dialogue modale est active.If you do not do so, you may receive the error: "Microsoft Visual Studio cannot shut down because a modal dialog is active. Fermez la boîte de dialogue et réessayez. »Close the active dialog and try again."

Il existe deux façons d’effectuer cette opération.There are two ways of doing this. Si vous disposez d’une boîte de dialogue WPF, il est recommandé de dériver de DialogWindow, puis appelez ShowModal pour afficher la boîte de dialogue.The recommended way, if you have a WPF dialog box, is to derive it from DialogWindow, and then call ShowModal to display the dialog box. Si vous faites cela, il est inutile de gérer l’état modal de la fenêtre parente.If you do this, you do not need to manage the modal state of the parent window.

Si votre boîte de dialogue n’est pas WPF, ou pour une autre raison, vous ne pouvez pas dériver votre boîte de dialogue classe DialogWindow, vous devez obtenir le parent de la boîte de dialogue en appelant GetDialogOwnerHwnd et gérer l’état modal vous-même, en appelant le EnableModeless méthode avec un paramètre de 0 (false) avant d’afficher la boîte de dialogue et en appelant la méthode avec un paramètre de 1 (true) après la fermeture de la boîte de dialogue.If your dialog box is not WPF, or for some other reason you cannot derive your dialog box class from DialogWindow, then you must get the parent of the dialog box by calling GetDialogOwnerHwnd and manage the modal state yourself, by calling the EnableModeless method with a parameter of 0 (false) before displaying the dialog box and calling the method again with a parameter of 1 (true) after closing the dialog box.

Création d’une boîte de dialogue dérivées de DialogWindowCreating a dialog box derived from DialogWindow

  1. Créez un projet VSIX nommé OpenDialogTest et ajoutez une commande de menu nommée OpenDialog.Create a VSIX project named OpenDialogTest and add a menu command named OpenDialog. Pour plus d’informations, consultez avec une commande de Menu pour créer une Extension.For more information about how to do this, see Creating an Extension with a Menu Command.

  2. Pour utiliser le DialogWindow (classe), vous devez ajouter des références aux assemblys suivants (dans l’onglet Framework de la ajouter une référence boîte de dialogue) :To use the DialogWindow class, you must add references to the following assemblies (in the Framework tab of the Add Reference dialog box):

    • PresentationCorePresentationCore

    • PresentationFrameworkPresentationFramework

    • WindowsBaseWindowsBase

    • System.XamlSystem.Xaml

  3. Dans OpenDialog.cs, ajoutez le code suivant using instruction :In OpenDialog.cs, add the following using statement:

    using Microsoft.VisualStudio.PlatformUI;  
    
  4. Déclarez une classe nommée TestDialogWindow qui dérive de DialogWindow:Declare a class named TestDialogWindow that derives from DialogWindow:

    class TestDialogWindow : DialogWindow  
    {. . .}  
    
  5. Pour être en mesure de réduire ou agrandir la boîte de dialogue, définissez HasMaximizeButton et HasMinimizeButton sur true :To be able to minimize and maximize the dialog box, set HasMaximizeButton and HasMinimizeButton to true:

    internal TestDialogWindow()  
    {  
        this.HasMaximizeButton = true;  
        this.HasMinimizeButton = true;  
    }  
    
  6. Dans le OpenDialog.ShowMessageBox (méthode), remplacez le code existant par le code suivant :In the OpenDialog.ShowMessageBox method, replace the existing code with the following:

    TestDialogWindow testDialog = new TestDialogWindow();  
    testDialog.ShowModal();  
    
  7. Générez et exécutez l’application.Build and run the application. L’instance expérimentale de Visual Studio doit apparaître.The experimental instance of Visual Studio should appear. Sur le outils menu de l’instance expérimentale, vous devez voir une commande nommée OpenDialog d’appeler.On the Tools menu of the experimental instance you should see a command named Invoke OpenDialog. Lorsque vous cliquez sur cette commande, vous devez voir la boîte de dialogue.When you click this command, you should see the dialog window. Vous devez être en mesure de réduire et agrandir la fenêtre.You should be able to minimize and maximize the window.

Création et gestion d’une boîte de dialogue non dérivée de DialogWindowCreating and managing a dialog box not derived from DialogWindow

  1. Pour cette procédure, vous pouvez utiliser la OpenDialogTest solution que vous avez créé dans la procédure précédente, avec les mêmes références d’assembly.For this procedure, you can use the OpenDialogTest solution you created in the previous procedure, with the same assembly references.

  2. Ajoutez le code suivant using déclarations :Add the following using declarations:

    using System.Windows;  
    using Microsoft.Internal.VisualStudio.PlatformUI;  
    
  3. Créez une classe nommée TestDialogWindow2 qui dérive de Window:Create a class named TestDialogWindow2 that derives from Window:

    class TestDialogWindow2 : Window  
    {. . .}  
    
  4. Ajouter une référence privée à IVsUIShell:Add a private reference to IVsUIShell:

    private IVsUIShell shell;  
    
  5. Ajoutez un constructeur qui définit la référence à IVsUIShell:Add a constructor that sets the reference to IVsUIShell:

    public TestDialogWindow2(IVsUIShell uiShell)  
    {  
        shell = uiShell;  
    }  
    
  6. Dans le OpenDialog.ShowMessageBox (méthode), remplacez le code existant par le code suivant :In the OpenDialog.ShowMessageBox method, replace the existing code with the following:

    IVsUIShell uiShell = (IVsUIShell)ServiceProvider.GetService(typeof(SVsUIShell));  
    
    TestDialogWindow2 testDialog2 = new TestDialogWindow2(uiShell);  
    //get the owner of this dialog  
    IntPtr hwnd;  
    uiShell.GetDialogOwnerHwnd(out hwnd);  
    testDialog2.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner;  
    uiShell.EnableModeless(0);  
    try  
    {  
        WindowHelper.ShowModal(testDialog2, hwnd);  
    }  
    finally  
    {  
        // This will take place after the window is closed.  
        uiShell.EnableModeless(1);  
    }  
    
  7. Générez et exécutez l’application.Build and run the application. Sur le outils menu, vous devez voir une commande nommée OpenDialog d’appeler.On the Tools menu you should see a command named Invoke OpenDialog. Lorsque vous cliquez sur cette commande, vous devez voir la boîte de dialogue.When you click this command, you should see the dialog window.