共用方式為


建立和管理強制回應對話方塊

當您在 Visual Studio 內建立強制回應對話方塊時,您必須確定對話方塊的父視窗在對話方塊顯示時已停用,然後在對話方塊關閉之後重新啟用父視窗。 如果您未這麼做,可能會收到錯誤:「Microsoft Visual Studio 無法關閉,因為強制回應對話方塊為作用中。請關閉使用中的對話方塊,然後再試一次。」

有兩種作法。 如果您有 WPF 對話方塊,建議的方法是從 DialogWindow 衍生,然後呼叫 ShowModal 以顯示對話方塊。 如果您這麼做,就不需要管理父視窗的強制回應狀態。

如果您的對話方塊不是 WPF,或基於其他原因,您無法從 DialogWindow 衍生對話方塊類別,則您必須呼叫 GetDialogOwnerHwnd 來取得對話方塊的父代,並自行管理強制回營狀態,方法是在顯示對話方塊之前使用 0 (false) 的參數呼叫 EnableModeless 方法,然後在關閉對話方塊之後使用 1 (true) 的參數再次呼叫該方法。

建立衍生自 DialogWindow 的對話方塊

  1. 建立名為「OpenDialogTest」的 VSIX 專案,並新增名為「OpenDialog」的功能表命令。 如需如何執行這項操作的詳細資訊,請參閱使用功能表命令建立延伸模組

  2. 若要使用 DialogWindow 類別,您必須新增下列組件的參考 (在 [新增參考] 對話方塊的 [架構] 索引標籤中):

    • PresentationCore

    • PresentationFramework

    • WindowsBase

    • System.Xaml

  3. 在 OpenDialog.cs 中,新增下列 using 陳述式:

    using Microsoft.VisualStudio.PlatformUI;
    
  4. 宣告衍生自 DialogWindow 且名為 TestDialogWindow 的類別:

    class TestDialogWindow : DialogWindow
    {. . .}
    
  5. 若要能夠將對話方塊最小化並最大化,請將 HasMaximizeButtonHasMinimizeButton 設定為 true:

    internal TestDialogWindow()
    {
        this.HasMaximizeButton = true;
        this.HasMinimizeButton = true;
    }
    
  6. OpenDialog.ShowMessageBox 方法中,以下列內容取代現有程式碼:

    TestDialogWindow testDialog = new TestDialogWindow();
    testDialog.ShowModal();
    
  7. 建置並執行應用程式。 應該會顯示 Visual Studio 實驗執行個體。 在實驗執行個體的 [工具] 功能表上,您應該會看到名為 [叫用 OpenDialog] 的命令。 當您按下此命令時,應該會看到對話方塊視窗。 您應該能夠將視窗最小化並最大化。

建立和管理未衍生自 DialogWindow 的對話方塊

  1. 針對此程序,您可以使用您在上一個程序中建立的 OpenDialogTest 方案,搭配相同的組件參考。

  2. 新增下列 using 宣告:

    using System.Windows;
    using Microsoft.Internal.VisualStudio.PlatformUI;
    
  3. 建立衍生自 Window 且名為 TestDialogWindow2 的類別:

    class TestDialogWindow2 : Window
    {. . .}
    
  4. 新增對 IVsUIShell 的私用參考:

    private IVsUIShell shell;
    
  5. 新增將參考設定為 IVsUIShell 的建構函式:

    public TestDialogWindow2(IVsUIShell uiShell)
    {
        shell = uiShell;
    }
    
  6. OpenDialog.ShowMessageBox 方法中,以下列內容取代現有程式碼:

    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. 建置並執行應用程式。 在 [工具] 功能表上,您應該會看到名為 [叫用 OpenDialog] 的命令。 當您按下此命令時,應該會看到對話方塊視窗。