모달 대화 상자 만들기 및 관리
Visual Studio 안에서 모달 대화 상자를 만들 때는 대화 상자가 표시되는 동안에는 대화 상자의 부모 창을 사용하지 않도록 설정했다가 대화 상자가 닫힌 다음에 부모 창을 다시 사용하도록 설정해야 합니다. 이렇게 하지 않으면 모달 대화 상자가 활성화되어 있으므로 Microsoft Visual Studio를 종료할 수 없다는 오류가 표시될 수 있습니다. 활성 대화 상자를 닫고 다시 시도합니다.
이 작업은 다음 두 가지 방법으로 수행할 수 있습니다. WPF 대화 상자가 있는 경우에는 DialogWindow에서 해당 대화 상자를 파생한 다음 ShowModal을 호출해 표시하는 것이 좋습니다. 이렇게 하면 부모 창의 모달 상태를 관리할 필요가 없습니다.
대화 상자가 WPF가 아니거나, 그 밖의 이유로 인해 대화 상자 클래스를 DialogWindow에서 파생할 수 없는 경우에는 GetDialogOwnerHwnd를 호출해 해당 대화 상자의 부모를 가져온 다음 EnableModeless 메서드를 호출해 직접 모달 상태를 관리해야 하며, 대화 상자 표시 전에 메서드를 호출할 때는 매개 변수를 0(false)으로, 대화 상자를 닫은 다음 다시 메서드를 호출할 때는 매개 변수를 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 호출이라는 명령이 표시되어야 합니다. 이 명령을 클릭할 때 대화 창이 표시되어야 합니다.