2009-10-20 10 views
6

이상한 질문이지만 저를 조금 괴롭히는 질문입니다. 예전에는 터미널과 DOS가 있었을 때 일반적으로 응용 프로그램에는 하나의 "창"만 있었으며 전체 화면이었습니다. 사람들이 기능을 전환 할 때 새 창을 여는 개념이 없었지만 대신 기본 창의 내용을 덮어 썼습니다. 따라서 메인 윈도우는 하나 뿐이었지만 렌더링 된 여러 개의 스크린이있었습니다.응용 프로그램에서 여러 화면 구현

현대적인 응용 프로그램 인 WinForms 또는 WPF에서 어떻게 그런 식으로 만들겠습니까?

  • 는 여러 Windows 유무 :

    는 두 가지 방법이있을 것 같다. 이는 일반적인 접근 방식이며 일반적으로 사용자가 동시에 여러 창을 사용하도록 허용하는 것이 바람직하지만 필요하지 않을 수도 있습니다. Show() 대신 ShowDialog()를 사용하면 두 번째 Window Modal을 만드는 일반적인 방법입니다.

  • 하나의 창만 있지만 TabControl을 사용하십시오. 탭을 숨기고 프로그래밍 방식으로 전환하십시오. 이것은 "One Window, multiple screens"동작에 가깝지만 동일한 Form 클래스의 모든 컨트롤을 가지고 있으므로 당연히 혼란스러워집니다 (컨트롤의 적절한 이름 지정이 필요하다고 주장 할지라도). 부분 클래스 및 화면 당 하나의 .cs)

더 좋은 방법이 있을까요? 본질적으로 "보라, 경계 스타일/아이콘이나 메인 메뉴 스트립 같은 것은 신경 쓰지 않는다. 내가 원하는 것은이 스크린을이 영역으로 렌더링한다는 것이다." 실제 페이지는 플레이스 홀더로 렌더링되는 내용 만 정의하는 ASP.net Master Page와 같습니다.

일부 이 있습니까? 이와 비슷한 기능이 있습니까?

아니면 전체적인 접근 방식에 문제가 있습니까?

답변

7

한 가지 방법은 각 화면을 사용자 정의 컨트롤로 구현하고 필요에 따라 이러한 컨트롤을 기본 창에 동적으로로드 및 언로드하는 것입니다. 윈도우 모바일 애플리케이션에서이 접근법을 사용해 왔지만 꽤 잘 돌아갔다.

+1

+1; 나는이 대답의 변이를 쓰고 있었다. 이제는 꼭 가질 필요가 없습니다! –

+0

사용자 컨트 롤을 패널과 같은 다른 컨테이너에 넣을 수 있으므로 특히 좋습니다. 관리가 어려워졌습니다. –

1

이 작업을 수행하는 데 필요한 특정 프레임 워크를 들어 보지 못했지만 각 페이지에 UserControl 또는 원하는 렌더링 논리가있는 컨트롤의 하위 클래스를 만들 것입니다. 이러한 페이지 컨트롤은 모두 폼의 멤버가 될 것이며 필요에 따라 Controls 컬렉션에 추가됩니다 (또는 너무 많으면 필요에 따라 만들어집니다). 초기화시 Dock = DockStyle.Fill과 같은 속성이 설정됩니다. 페이지를 변경하는 경우 :

void ChangePage(object sender, EventArgs e) 
{ 
    Controls.Clear(); 
    Controls.Add(sender as Control); 
}
3

당신이 WPF를 언급 고려할 때 Prism (MPP에서 복합 UI 프레임 워크)를 구현한다고 언급 할 가치가 그 (같은 일반 골재) 단일 컨트롤러 내에서 중 여러 뷰 (된 UserControls)를 사용하여 또는 여러 개의 컨트롤러 (여러 집계에 걸쳐 있음).

보기 또는 해당 발표자가 명령을 실행하거나 IEventAggregator를 통해 이벤트를 브로드 캐스팅 할 수 있으며 네비게이션 컨트롤러가 적절한 "지역"에 할당 된 현재보기를 변경하여 응답 할 수 있습니다. 실제로 Prism의 지역 모델은 MasterPage/Placeholder 모델과 매우 유사하므로이를 조사하고 싶을 수도 있습니다.

프리즘에는 내비게이션 내역 (뒤로/앞으로) 추적 기능이 포함될 수도 있지만 사용하는 경우에는 사용하지 않았습니다.

1

저는 C# 개발자로 일하면서 단계별로 여러 화면 (페이지) 응용 프로그램에 대해 UserControl을 사용하기 시작했습니다. UserControl을 확장하는 BasePage라는 페이지에 대한 기본 클래스를 빌드하고 필요한 모든 페이지 (MainPage, SettingsPage 등)에 대해 확장합니다. MainForm (응용 프로그램의 유일한 양식)에서 필요한 페이지를로드 할 수있는 BasePage 컨트롤 (예 : CurrentPage)을 추가했습니다. MainForm에서 필요한 이벤트를 CurrentPage로 보냅니다. 나는 이것이 하나의 형태로 여러 형태가 필요한 이런 종류의 응용을위한 최선의 해결책이라고 생각합니다. 이것은 모든 여러 페이지 응용 프로그램에 사용되는 구조입니다.

탭 컨트롤을 사용하면 동시에로드 된 모든 탭의 모든 컨트롤로 폼이 질식합니다. 저는 10 개 이상의 탭이있는 프로젝트를 보았습니다. 매우 복잡한 응용 프로그램은 매우 느리고 코드 작성이 어려웠습니다.

이 답변이 유용 할 것입니다.

관련 문제