2009-09-11 3 views
1

WPF 앱에서 작업 중이며 UI가 조금 복잡해지고 있습니다. 그것이 성장함에 따라 그것을 유지하는 방법에 대한 조언을 찾고 있습니다.WPF : UI Composition

레이아웃은 윈도우가 구성되어 일부 복잡한 데이터에이

<Grid> 
    <List of Objects View/> 
    <Objects Relationship View/> 
    <Object Details View /> 
    <Multiple Objects Details View/> 
    <View 5 /> 
    <View 6 /> 
    : 
    : 
</Grid> 
(숨겨진 가시성) 각 뷰가 작성되는

와 결합, 같은 것을 보인다. 한 번에 하나의보기 만 사용자에게 보입니다. 나는 시야를 조작함으로써 이것을한다.

그러나 문제는보기 간의 전환이 가시성을 뒤집는 것을 포함하지 않는다는 것입니다. currentdata를 사용하여 다시 바인딩하고 백그라운드 스레드/타이머를 중지 한 다음 새로 선택된 뷰를 지원하는 새 스레드 및 타이머를 시작합니다. 그래서 내가하는 모든 새로운 관점에 어떤 일이 일어나고 있는지, 가능한 모든 전환을 처리하기 위해 모든 코드를 추가하고 있습니다.

이런 종류의 시나리오를 처리하는 데 사용할 수있는 패턴이 있습니까?

또한 앱로드시 모든 것을 숨기고 숨기지 않고 컨트롤러로 가시성을 사용하는 방법이 있습니까?

도움을 주시면 대단히 감사하겠습니다. 감사!

답변

2

사용자가보기간에 앞뒤로 전환하는 것을 허용하는 방법을 묻습니다. 핵심 콤보입니까? Mouseclick?

그 자체로 질문에 답하고있는 것은 아니지만 제 제안은 탭 컨트롤을위한 완벽한 시나리오처럼 들린다는 것입니다. 그리고 WPF에서는 탭 컨트롤과 같이 보이지 않아도됩니다.

TabControl을 사용하는 경우 TabControl에서 나오는 SelectionChanged 이벤트를 사용하여 백그라운드 스레드가 멈추도록 지정하고 언로드해야하는 모든 것을 언로드 할 수 있습니다.

TabControl 사용 방법에 따라 UI를 다소 가상화 할 수 있습니다. 즉, 탭을 선택하지 않을 때마다 해당 탭의 모든 UI가 삭제되고 다음에 선택 될 때 다시 작성된다는 것입니다. MVVM 또는 PresentationModel 패턴을 사용하고 ViewModels을 TabControl의 항목으로로드하고 해당 뷰에 대해 DataTemplates를 사용하면이 방법으로 작동합니다. TabItem을 TabControl 내부에있는 컨트롤과 함께 넣으면 TabItem을이 방식으로 작동하지 않게됩니다.

패턴에 관한 한, 나는 확실히 MVVM을 권하고 싶습니다. 그것을 따라 잡고 이해하는 데 약간의 시간이 걸릴 수 있지만 WPF를 사용하지 않으면 절대로 그렇게하지 않을 것입니다. 더 이상 리소스 나 예제가 필요하면 알려주십시오.

편집 :

나는 질문을 다시 읽고 당신이 탐색의 또 다른 유형의 필요에있을 수 있습니다 것으로 나타났습니다. 사용자 작업을 기반으로 다른보기로 전환해야하는보기가 있고보고 싶은보기를 선택할 수 있도록 모든보기를 사용자에게 표시하지 않으려면 (예 : TabControl 할 것입니다), 당신은 WPF Navigation보고 싶지 있습니다. 탐색은 기본적으로 MS가 WPF에 추가하여 WPF 앱에서 브라우저 스타일 탐색을 허용하는 것입니다. This MSDN article은 그런 종류의 좋은 리소스 여야합니다.

+0

참고로 TabControl을 사용하면 모든 뷰에서 성가신 Visibility 속성을 변경하지 않아도됩니다. 왝. – dustyburwell

+0

감사합니다 ascalonx! 도움이됩니다. 코드 샘플에 대한 링크가 있습니까? 나는 tabcontrol을 다시보아야한다. (얼마전에 했었지만 지갑하지 않았다.) 전이 로직이 SelectionChanged 핸들러 내부에 있다는 말입니까? 또한 왜 "TabItems를 TabControl 내부에있는 컨트롤과 함께 넣지 않는가?" 현재보기 내에서 메뉴 항목 클릭 또는 단추 클릭의 조합을 통해보기간에 사용자 전환이 이루어집니다. – Sharun

+0

Yuck이 맞습니다! 장소 전체에서 그 값을 뒤집을 수없는 병. – Sharun

1

이 문제는 Composite WPF (Prism)에 적합합니다. 주 영역을 영역으로 정의하고 SingleActiveRegion을 사용하여 한 번에 하나의 뷰를 표시 할 수 있습니다.자신의 region 어댑터를 작성하는 경우, 활성 뷰가 변경 될 때 모든 유지 보수를 수행 할 수 있습니다.

또한 새보기를 추가해도 호스팅보기의 코드는 변경되지 않습니다. 이렇게하면 별도의 어셈블리에서 향후 추가 뷰를 배포 할 수 있습니다.