다음을 통해 공유


옵션 페이지 만들기

이 연습에서는 속성 그리드를 사용하여 속성을 검사하고 설정하는 간단한 도구/옵션 페이지를 만듭니다.

이러한 속성을 설정 파일에 저장하고 설정 파일에서 복원하려면 다음 단계를 수행한 다음, 설정 범주 만들기를 참조하세요.

MPF는 도구 옵션 페이지를 만드는 데 도움이 되는 Package 클래스와 DialogPage 클래스라는 두 가지 클래스를 제공합니다. Package 클래스를 서브클래싱하여 이러한 페이지에 대한 컨테이너를 제공하는 VSPackage를 만듭니다. DialogPage 클래스에서 파생하여 각 도구 옵션 페이지를 만듭니다.

도구 옵션 그리드 페이지 만들기

이 섹션에서는 간단한 도구 옵션 속성 그리드를 만듭니다. 이 그리드를 사용하여 속성 값을 표시하고 변경할 수 있습니다.

VSIX 프로젝트를 만들고 VSPackage를 추가하기

  1. 모든 Visual Studio 확장은 확장 자산을 포함하는 VSIX 배포 프로젝트로 시작합니다. MyToolsOptionsExtension이라는 Visual Studio VSIX 프로젝트를 만듭니다. “vsix”를 검색하여 새 프로젝트 대화 상자에서 VSIX 프로젝트 템플릿을 찾을 수 있습니다.

  2. MyToolsOptionsPackage이라는 Visual Studio 패키지 항목 템플릿을 추가하여 VSPackage를 추가합니다. 솔루션 탐색기에서 프로젝트 노드를 마우스 오른쪽 단추로 클릭하고 추가>새 항목을 선택합니다. 새 항목 추가 대화 상자에서 Visual C# 항목>확장성으로 이동하여 Visual Studio 패키지를 선택합니다. 대화 상자 하단의 이름 필드에서 파일 이름을 MyToolsOptionsPackage.cs로 변경합니다. VSPackage를 만드는 방법에 대한 자세한 내용은 VSPackage를 사용하여 확장 만들기를 참조하세요.

도구 옵션 속성 그리드 만들기

  1. 코드 편집기에서 MyToolsOptionsPackage 파일을 엽니다.

  2. 다음 using 문을 추가합니다.

    using System.ComponentModel;
    
  3. OptionPageGrid 클래스를 선언하고 DialogPage에서 파생시킵니다.

    public class OptionPageGrid : DialogPage
    {  }
    
  4. ProvideOptionPageAttributeVSPackage 클래스에 적용하여 OptionPageGrid에 대한 옵션 범주 및 옵션 페이지 이름을 클래스에 할당합니다. 결과는 다음과 같습니다.

    [PackageRegistration(UseManagedResourcesOnly = true)]
    [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
    [ProvideMenuResource("Menus.ctmenu", 1)]
    [Guid(GuidList.guidMyToolsOptionsPkgString)]
    [ProvideOptionPage(typeof(OptionPageGrid),
        "My Category", "My Grid Page", 0, 0, true)]
    public sealed class MyToolsOptionsPackage : Package
    
  5. OptionPageGrid 클래스에 OptionInteger 속성을 추가합니다.

    public class OptionPageGrid : DialogPage
    {
        private int optionInt = 256;
    
        [Category("My Category")]
        [DisplayName("My Integer Option")]
        [Description("My integer option")]
        public int OptionInteger
        {
            get { return optionInt; }
            set { optionInt = value; }
        }
    }
    

    참고

    DialogPage의 기본 구현은 적절한 변환기가 있거나 적절한 변환기가 있는 속성으로 확장할 수 있는 구조 또는 배열인 속성을 지원합니다. 변환기 목록은 System.ComponentModel 네임스페이스를 참조하세요.

  6. 프로젝트를 빌드하고 디버깅을 시작합니다.

  7. Visual Studio의 실험적 인스턴스에서 도구 메뉴의 옵션을 클릭합니다.

    왼쪽 창에 내 범주가 표시됩니다. (옵션 범주는 사전순으로 나열되므로 목록의 중간 정도에 표시됩니다.) 내 범주를 열고 내 그리드 페이지를 클릭합니다. 옵션 그리드가 오른쪽 창에 나타납니다. 속성 범주는 내 옵션이고 속성 이름은 내 정수 옵션입니다. 속성 설명 내 정수 옵션이 창 아래쪽에 나타납니다. 값을 초기 값인 256에서 다른 값으로 변경합니다. 확인을 클릭한 다음, 내 그리드 페이지를 다시 엽니다. 새 값이 유지되는 것을 볼 수 있습니다.

    옵션 페이지는 Visual Studio의 검색 상자를 통해서도 사용할 수 있습니다. IDE 상단 근처의 검색 상자에 내 범주를 입력하면 결과에 내 범주 -> 내 그리드 페이지가 표시됩니다.

도구 옵션 사용자 지정 페이지 만들기

이 섹션에서는 사용자 지정 UI가 있는 도구 옵션 페이지를 만듭니다. 이 페이지를 사용하여 속성 값을 표시하고 변경할 수 있습니다.

  1. 코드 편집기에서 MyToolsOptionsPackage 파일을 엽니다.

  2. 다음 using 문을 추가합니다.

    using System.Windows.Forms;
    
  3. OptionPageGrid 클래스 바로 앞에 OptionPageCustom 클래스를 추가합니다. DialogPage에서 새 클래스를 파생시킵니다.

    public class OptionPageCustom : DialogPage
    {
        private string optionValue = "alpha";
    
        public string OptionString
        {
            get { return optionValue; }
            set { optionValue = value; }
        }
    }
    
  4. GUID 특성을 추가합니다. OptionString 속성을 추가합니다.

    [Guid("00000000-0000-0000-0000-000000000000")]
    public class OptionPageCustom : DialogPage
    {
        private string optionValue = "alpha";
    
        public string OptionString
        {
            get { return optionValue; }
            set { optionValue = value; }
        }
    }
    
  5. 두 번째 ProvideOptionPageAttribute를 VSPackage 클래스에 적용합니다. 이 특성은 클래스에 옵션 범주 및 옵션 페이지 이름을 할당합니다.

    [PackageRegistration(UseManagedResourcesOnly = true)]
    [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
    [ProvideMenuResource("Menus.ctmenu", 1)]
    [Guid(GuidList.guidMyToolsOptionsPkgString)]
    [ProvideOptionPage(typeof(OptionPageGrid),
        "My Category", "My Grid Page", 0, 0, true)]
    [ProvideOptionPage(typeof(OptionPageCustom),
        "My Category", "My Custom Page", 0, 0, true)]
    public sealed class MyToolsOptionsPackage : Package
    
  6. MyUserControl이라는 새 사용자 정의 컨트롤을 프로젝트에 추가합니다.

  7. 사용자 정의 컨트롤에 TextBox 컨트롤을 추가합니다.

    속성 창의 도구 모음에서 이벤트 단추를 클릭한 다음, 벗어나기 이벤트를 두 번 클릭합니다. 새 이벤트 처리기가 MyUserControl.cs 코드에 나타납니다.

  8. 공용 OptionsPage 필드, Initialize 메서드를 컨트롤 클래스에 추가하고 이벤트 처리기를 업데이트하여 옵션 값을 텍스트 상자의 내용으로 설정합니다.

    public partial class MyUserControl : UserControl
    {
        public MyUserControl()
        {
            InitializeComponent();
        }
    
        internal OptionPageCustom optionsPage;
    
        public void Initialize()
        {
            textBox1.Text = optionsPage.OptionString;
        }
    
        private void textBox1_Leave(object sender, EventArgs e)
        {
            optionsPage.OptionString = textBox1.Text;
        }
    }
    

    optionsPage 필드는 부모 OptionPageCustom 인스턴스에 대한 참조를 보유합니다. Initialize 메서드는 TextBoxOptionString을 표시합니다. 이벤트 처리기는 포커스가 TextBox를 벗어날 때 TextBox의 현재 값을 OptionString에 씁니다.

  9. 패키지 코드 파일에서 OptionPageCustom.Window 속성에 대한 재정의를 OptionPageCustom 클래스에 추가하여 MyUserControl 인스턴스를 만들고 초기화하고 반환합니다. 이제 클래스는 다음과 같이 표시됩니다.

    [Guid("00000000-0000-0000-0000-000000000000")]
    public class OptionPageCustom : DialogPage
    {
        private string optionValue = "alpha";
    
        public string OptionString
        {
            get { return optionValue; }
            set { optionValue = value; }
        }
    
        protected override IWin32Window Window
        {
            get
            {
                MyUserControl page = new MyUserControl();
                page.optionsPage = this;
                page.Initialize();
                return page;
            }
        }
    }
    
  10. 프로젝트를 빌드하고 실행합니다.

  11. 실험적 인스턴스에서 도구>옵션을 클릭합니다.

  12. 내 범주를 찾은 다음, 내 사용자 지정 페이지를 찾습니다.

  13. OptionString 값을 변경합니다. 확인을 클릭한 다음, 내 사용자 지정 페이지를 다시 엽니다. 새 값이 유지되는 것을 볼 수 있습니다.

액세스 옵션

이 섹션에서는 연결된 도구 옵션 페이지를 호스트하는 VSPackage에서 옵션 값을 가져옵니다. 동일한 기술을 사용하여 공용 속성의 값을 확보할 수 있습니다.

  1. 패키지 코드 파일에서 OptionInteger라는 공용 속성을 MyToolsOptionsPackage 클래스에 추가합니다.

    public int OptionInteger
    {
        get
        {
            OptionPageGrid page = (OptionPageGrid)GetDialogPage(typeof(OptionPageGrid));
            return page.OptionInteger;
        }
    }
    
    

    이 코드는 GetDialogPage를 호출하여 OptionPageGrid 인스턴스를 생성하거나 검색합니다. OptionPageGrid는 공용 속성인 해당 옵션을 로드하기 위해 LoadSettingsFromStorage를 호출합니다.

  2. 이제 MyToolsOptionsCommand라는 사용자 지정 명령 항목 템플릿을 추가하여 값을 표시합니다. 새 항목 추가 대화 상자에서 Visual C#>확장성으로 이동하여 사용자 지정 명령을 선택합니다. 창 아래쪽의 이름 필드에서 명령 파일 이름을 MyToolsOptionsCommand.cs로 변경합니다.

  3. MyToolsOptionsCommand 파일에서 명령의 ShowMessageBox 메서드 본문을 다음으로 바꿉니다.

    private void ShowMessageBox(object sender, EventArgs e)
    {
        MyToolsOptionsPackage myToolsOptionsPackage = this.package as MyToolsOptionsPackage;
        System.Windows.Forms.MessageBox.Show(string.Format(CultureInfo.CurrentCulture, "OptionInteger: {0}", myToolsOptionsPackage.OptionInteger));
    }
    
    
  4. 프로젝트를 빌드하고 디버깅을 시작합니다.

  5. 실험적 인스턴스의 도구 메뉴에서 MyToolsOptionsCommand 호출을 클릭합니다.

    메시지 상자에 OptionInteger의 현재 값이 표시됩니다.

옵션 페이지 열기

이 섹션에서는 옵션 페이지를 여는 단추에 대한 명령 및 이벤트를 추가합니다.

  1. 먼저 OpenPageCommand.cs라는 파일을 추가합니다.

  2. 그런 다음 OpenPageCommand.cs를 열고 Execute 메서드를 변경합니다.

    private void Execute(object sender, EventArgs e)
    {
        ThreadHelper.ThrowIfNotOnUIThread();
        Type optionsPageType = typeof(OptionPageCustom);
        Instance.package.ShowOptionPage(optionsPageType);
    }
    
  3. 프로젝트를 실행한 다음 호출 단추(기본적으로 도구 옵션 아래에 있음)를 클릭합니다. 그러면 옵션 페이지가 열리는 것을 볼 수 있습니다.

  4. 옵션 페이지 열기에 대한 자세한 내용은 다음 문서를 참조할 수 있습니다.