2010-02-26 3 views
30

C# .NET에서 Windows Forms 응용 프로그램 용 마법사 만들기의 새로운 기능입니다. 그래서 나는 마법사 창작에 대해 전혀 모른다. 다중 마법사 생성에 대한 아이디어를 알려주십시오.C#에서 Windows Forms 용 마법사 만들기

감사합니다, 라비

답변

1

당신은 자신의 선호에 부합하는 자신의 작성해야합니다. 팁은 "frmWizard"와 같은 이름의 기본 폼을 만드는 것입니다. 그러면 모든 마법사 창에서 기본 폼을 상속받습니다. 기본 객체에 공통 객체 또는 마법사 객체를 넣고 필요할 경우 파생 클래스에서 수정 또는 재정의해야합니다.

+1

기본 양식 (여기 제안) + (다른 답변에서 설명) 사용자 정의 탭 컨트롤을 결합하는 데 유용합니다. 마법사를위한 기반 생성은 응용 프로그램에 둘 이상의 마법사가있는 경우 특히 유용합니다. 복사 - 붙여 넣기 코딩 공포를 피하는 데 도움이됩니다. – miroxlav

+0

일반적으로 기본 클래스에서 구현하는 유용한 메소드는'OnPageEntered','OnPageExited','AllowNext','AllowBack' 등입니다. – KDecker

126

많은 방법이 있습니다. 각 마법사 단계마다 양식을 만들 수는 있지만 매우 어색합니다. 그리고 사용자가 단계를 변경할 때 깜박 거리는 추악한 상황. UserControl이 수행 할 수있는 각 단계를 수행하기 만하면 폼의 Controls 컬렉션을 안팎으로 쉽게 전환 할 수 있습니다. 또는 각 단계마다 Visible = true 중 하나를 만듭니다. UC 디자인은 복잡한 경향이 있지만 각 UI 항목에 공용 속성을 추가해야합니다.

쉽고 RAD적인 방법은 TabControl을 사용하는 것입니다. 디자인 타임에 탭을 전환하고 각 탭의 컨트롤을 드롭 할 수 있으므로 디자이너에서 매우 잘 작동합니다. 단계를 바꾸는 것은 간단합니다. SelectedIndex 속성을 변경하기 만하면됩니다. 중요한 것은 런타임에 탭을 숨기는 것입니다. Windows 메시지를 처리하여 여전히 쉽게 수행 할 수 있습니다. 양식에 새 클래스를 추가하고 아래 표시된 코드를 붙여 넣습니다. 엮다. 새 컨트롤을 도구 상자의 위쪽에서 폼으로 끌어다 놓습니다.

using System; 
using System.Windows.Forms; 

class WizardPages : TabControl { 
    protected override void WndProc(ref Message m) { 
    // Hide tabs by trapping the TCM_ADJUSTRECT message 
    if (m.Msg == 0x1328 && !DesignMode) m.Result = (IntPtr)1; 
    else base.WndProc(ref m); 
    } 
} 
+4

+51 : 이제 탭 컨트롤을 사용하여 탭을 숨길 수 있습니다. .and 탭 인덱스와 탭 페이지 사이를 전환 ... ??? 나는 이것을 사용할 것입니다 ... 겹쳐진 패널을 관리하는 것보다 훨씬 좋네요. – IAbstract

+0

@ 한스 좋은 답변 한스! 나는 단지 courius입니다 :이 완전히 탭을 숨기므로 사용자가 클릭 할 수 없거나 hittink Tab 키 또는 다른 것으로 활성화 할 수 있습니까? –

+0

@ Sean87 CTRL + TAB을 치는 것은 실제로 탭 페이지를 가로 질러 이동합니다. – ccalboni

29
class WizardPages : TabControl 
{ 
    protected override void WndProc(ref Message m) 
    { 
     // Hide tabs by trapping the TCM_ADJUSTRECT message 
     if (m.Msg == 0x1328 && !DesignMode) m.Result = (IntPtr)1; 
     else base.WndProc(ref m); 
    }   

    protected override void OnKeyDown(KeyEventArgs ke) 
    { 
     // Block Ctrl+Tab and Ctrl+Shift+Tab hotkeys 
     if (ke.Control && ke.KeyCode == Keys.Tab) 
      return; 
     base.OnKeyDown(ke); 
    } 
} 
+0

다른 키는 어떻게됩니까? PageUp 및 PageDown? 또는 왼쪽 및 오른쪽 화살표 키? 그 컨트롤의 자식 인 텍스트 상자 안을 이동할 수 없으므로 해당 컨트롤을 추가 할 수 없습니다. – Misiu

+0

'Ctrl' +'Tab'과'Ctrl' +'Shift' +'Tab'을 다룰 때'Ctrl' +'PgUp'과'Ctrl' +'PgDn'을 잊지 마십시오. 후자는'Ctrl' +'Tab'과'Ctrl' +'Shift' +'Tab'가 내부 컨트롤에 의해 취해진 많은 시나리오에서 더 지배적입니다. 여러 줄 입력 상자 – miroxlav

+0

@Misiu 키는 여전히 자식 컨트롤에서 잘 작동합니다. (그냥 테스트했습니다) – miroxlav