建立和管理強制回應對話方塊
當您在 Visual Studio 內建立強制回應對話方塊時,您必須確定對話方塊的父視窗在對話方塊顯示時已停用,然後在對話方塊關閉之後重新啟用父視窗。 如果您未這麼做,可能會收到錯誤:「Microsoft Visual Studio 無法關閉,因為強制回應對話方塊為作用中。請關閉使用中的對話方塊,然後再試一次。」
有兩種作法。 如果您有 WPF 對話方塊,建議的方法是從 DialogWindow 衍生,然後呼叫 ShowModal 以顯示對話方塊。 如果您這麼做,就不需要管理父視窗的強制回應狀態。
如果您的對話方塊不是 WPF,或基於其他原因,您無法從 DialogWindow 衍生對話方塊類別,則您必須呼叫 GetDialogOwnerHwnd 來取得對話方塊的父代,並自行管理強制回營狀態,方法是在顯示對話方塊之前使用 0 (false) 的參數呼叫 EnableModeless 方法,然後在關閉對話方塊之後使用 1 (true) 的參數再次呼叫該方法。
建立衍生自 DialogWindow 的對話方塊
建立名為「OpenDialogTest」的 VSIX 專案,並新增名為「OpenDialog」的功能表命令。 如需如何執行這項操作的詳細資訊,請參閱使用功能表命令建立延伸模組。
若要使用 DialogWindow 類別,您必須新增下列組件的參考 (在 [新增參考] 對話方塊的 [架構] 索引標籤中):
PresentationCore
PresentationFramework
WindowsBase
System.Xaml
在 OpenDialog.cs 中,新增下列
using
陳述式:using Microsoft.VisualStudio.PlatformUI;
宣告衍生自 DialogWindow 且名為
TestDialogWindow
的類別:class TestDialogWindow : DialogWindow {. . .}
若要能夠將對話方塊最小化並最大化,請將 HasMaximizeButton 和 HasMinimizeButton 設定為 true:
internal TestDialogWindow() { this.HasMaximizeButton = true; this.HasMinimizeButton = true; }
在
OpenDialog.ShowMessageBox
方法中,以下列內容取代現有程式碼:TestDialogWindow testDialog = new TestDialogWindow(); testDialog.ShowModal();
建置並執行應用程式。 應該會顯示 Visual Studio 實驗執行個體。 在實驗執行個體的 [工具] 功能表上,您應該會看到名為 [叫用 OpenDialog] 的命令。 當您按下此命令時,應該會看到對話方塊視窗。 您應該能夠將視窗最小化並最大化。
建立和管理未衍生自 DialogWindow 的對話方塊
針對此程序,您可以使用您在上一個程序中建立的 OpenDialogTest 方案,搭配相同的組件參考。
新增下列
using
宣告:using System.Windows; using Microsoft.Internal.VisualStudio.PlatformUI;
建立衍生自 Window 且名為
TestDialogWindow2
的類別:class TestDialogWindow2 : Window {. . .}
新增對 IVsUIShell 的私用參考:
private IVsUIShell shell;
新增將參考設定為 IVsUIShell 的建構函式:
public TestDialogWindow2(IVsUIShell uiShell) { shell = uiShell; }
在
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); }
建置並執行應用程式。 在 [工具] 功能表上,您應該會看到名為 [叫用 OpenDialog] 的命令。 當您按下此命令時,應該會看到對話方塊視窗。