Créer et gérer des boîtes de dialogue modales
Lorsque vous créez une boîte de dialogue modale dans 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éactivez la fenêtre parente une fois la boîte de dialogue fermée. Si ce n’est pas le cas, vous pouvez recevoir l’erreur : Microsoft Visual Studio ne peut pas s’arrêter, car une boîte de dialogue modale est active. Fermez la boîte de dialogue active et réessayez.
Il y a deux façons de le faire. La méthode recommandée, si vous avez une boîte de dialogue WPF, consiste à la dériver DialogWindow, puis à appeler ShowModal pour afficher la boîte de dialogue. Si vous effectuez cette opération, vous n’avez pas besoin de gérer l’état modal de la fenêtre parente.
Si votre boîte de dialogue n’est pas WPF ou, pour une autre raison, vous ne pouvez pas dériver votre classe DialogWindowde boîte de dialogue, vous devez obtenir le parent de la boîte de dialogue en appelant GetDialogOwnerHwnd et en gérant l’état modal vous-même, en appelant la EnableModeless méthode avec un paramètre de 0 (false) avant d’afficher la boîte de dialogue et d’appeler à nouveau la méthode avec un paramètre de 1 (true) après avoir fermé la boîte de dialogue.
Créer une boîte de dialogue dérivée de DialogWindow
Créez un projet VSIX nommé OpenDialogTest et ajoutez une commande de menu nommée OpenDialog. Pour plus d’informations sur la procédure à suivre, consultez Créer une extension avec une commande de menu.
Pour utiliser la DialogWindow classe, vous devez ajouter des références aux assemblys suivants (sous l’onglet Framework de la boîte de dialogue Ajouter une référence ) :
PresentationCore
PresentationFramework
WindowsBase
System.Xaml
Dans OpenDialog.cs, ajoutez l’instruction suivante
using
:using Microsoft.VisualStudio.PlatformUI;
Déclarez une classe nommée
TestDialogWindow
qui dérive de DialogWindow:class TestDialogWindow : DialogWindow {. . .}
Pour être en mesure de réduire et d’optimiser la boîte de dialogue, définissez et HasMinimizeButton définissez HasMaximizeButton la valeur true :
internal TestDialogWindow() { this.HasMaximizeButton = true; this.HasMinimizeButton = true; }
Dans la
OpenDialog.ShowMessageBox
méthode, remplacez le code existant par les éléments suivants :TestDialogWindow testDialog = new TestDialogWindow(); testDialog.ShowModal();
Générez et exécutez l’application. L’instance expérimentale de Visual Studio doit apparaître. Dans le menu Outils de l’instance expérimentale, vous devez voir une commande nommée Invoke OpenDialog. Lorsque vous cliquez sur cette commande, la fenêtre de boîte de dialogue doit s’afficher. Vous devez être en mesure de réduire et d’optimiser la fenêtre.
Créer et gérer une boîte de dialogue non dérivée de DialogWindow
Pour cette procédure, vous pouvez utiliser la solution OpenDialogTest que vous avez créée dans la procédure précédente, avec les mêmes références d’assembly.
Ajoutez les déclarations suivantes
using
:using System.Windows; using Microsoft.Internal.VisualStudio.PlatformUI;
Créez une classe nommée
TestDialogWindow2
qui dérive de Window:class TestDialogWindow2 : Window {. . .}
Ajoutez une référence privée à IVsUIShell:
private IVsUIShell shell;
Ajoutez un constructeur qui définit la référence à IVsUIShell:
public TestDialogWindow2(IVsUIShell uiShell) { shell = uiShell; }
Dans la
OpenDialog.ShowMessageBox
méthode, remplacez le code existant par les éléments suivants :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); }
Générez et exécutez l’application. Dans le menu Outils , vous devez voir une commande nommée Invoke OpenDialog. Lorsque vous cliquez sur cette commande, la fenêtre de boîte de dialogue doit s’afficher.