2014-01-25 5 views
1

다음 시나리오에 대한 대답을 찾으려고 시도했지만 대답이 나오지 않았습니다. 이것은 필자 자신의 입장으로 볼 때 전체 프리즘 개념을 완전히 이해하지 못했기 때문일 수 있습니다.프리즘 - 느슨하게 결합 된 어셈블리의 뷰 삽입

  1. 프레임 워크 프로젝트
  2. 쉘 프로젝트
  3. : 내 방어, 난, 그래서

    나는 다음과 같은 설정을 가지고 수많은 문학을 읽은 후 ... 부드러운하시기 바랍니다 이틀 전에 프리즘으로 찾기 시작

  4. MAINMENU 프로젝트 (모듈)
  5. SideMenu 프로젝트 (모듈)
  6. 상태 표시 프로젝트 (모듈)
  7. TestCont 엔타 프로젝트 (모듈)
  8. TestContentB 프로젝트 (모듈)

프레임 워크 프로젝트는 다른 것들, 이벤트 정의 및 페이로드 사이에 포함되어 있습니다.

쉘 프로젝트가의 shell.xaml 내 4 개 지역 :

  • MainMenuRegion
  • SideBarRegion
  • StatusBarRegion
  • ContentRegion 모든 비 쉘 프로젝트 참조가

다음 프리즘 어셈블리에 :

  • Microsoft.Practices.Prism
  • Microsoft.Practices.ServiceLocation
  • Microsoft.Practices.Unity

쉘 프로젝트 갖는 이러한 어셈블리에 더하여 기준으로 :

  • Microsoft.Practices.Prism.UnityExtensions

모든 프로젝트에는 Framework 프로젝트에 대한 참조가 있지만 솔루션 내의 다른 프로젝트에 대한 참조는 없습니다.

이 시점에서 나는 everthing이 계획대로 작동한다는 것을 지적하고자합니다.

MainMenuView 프로젝트에는 MainMenuViewModel에 명령이있는 몇 개의 MenuItem이 있습니다.

EventAggregator를 사용하는 ViewModel은 Framework 프로젝트에서 선언 된 몇 가지 이벤트를 게시합니다. 쉘 프로젝트에서

에서, ShellViewModel는 "ContentRegion"에 대한 제어로 ContentControl을 사용하여 이러한 이벤트, 예컨대 :

에 가입, 나는 아무런 문제없이 TestContentA 및 TestContentB 사이를 전환 할 수 있습니다.순간을 위해, TestContentA 및 TestContentB 모두는 내가 뭘하고 싶은 것은 대신 ContentControl을 컨트롤에 새로운 TabItem의로있는 TabControl에 TestContentA 및 TestContentB를 주입입니다

.RegisterViewWithRegion method(...) 

사용하여 등록된다.

그래서 shell.xaml에는 "TabRegion"이라는 추가 영역과 함께 TabControl이 포함되어 있습니다. I는 다음

.RegisterViewWithRegion(...) 

방법을 사용하여, 다시 TabRegion ContentRegion에서 등록 영역을 변경. 이 한,

IRegion tabRegion = regionManager.Regions["TabRegion"]; 
var tabView1 = container.Resolve(); 
tabRegion.Add(tabView1, "FirstTabView"); 

나는 ShellViewModel에 컨테이너를 가지고 있지 않지만 나는 여기가 않았더라도, 나는 여전히 TestContentA보기를 참조 할 수 없습니다 :

내가 좋아하는 예를 많이 보았다 그 자체가 런타임에 발견 될 다른 어셈블리에서.

온라인에서 찾을 수있는 샘플과 달리, 삽입 될보기가 항상 샘플 프로젝트에있는 것처럼 보입니다. 찾아 가기 방법에서는

(디버깅 목적) I 코드 추가하면 :

var tabRegion = regionManager.Regions["TabRegion"]; 

다음 I가 tabRegion가보기 컬렉션이 볼 수 있고, 이러한 관점에서 I는 TestContentA에서 모두보기를 볼 수 및 뷰가 올바르게 등록되었다는 것을 알려주는 TestContentB. 문제는 뷰의 새로운 인스턴스를 TabItem으로 삽입 할 수 있도록 뷰를 잡는 방법을 모른다는 것입니다.

치트 및 TestContentA에 대한 참조를 추가하면보기를 추가하기 만하면 TabItem이 나타납니다. 이것 역시 나에게 내가 인 것을 말해 준다. 물론, 아무런 참고도 원하지 않는다.

요약하면, 내 질문은 다음과 같습니다

이 어떻게 응용 프로그램이 시작될 때 발견되는 느슨하게 결합 된 어셈블리에서보기를 삽입 할 수 ?

내가 할 수 있다고 확신하는 누군가가 올바른 방향으로 나를 가리킬 수 있다면 그것을 주셔서 감사하겠습니다.

시간을내어 읽어 주셔서 감사합니다.

답변

2

부트 스트 래퍼를 만들어야합니다. 로드 된 각 모듈은 ServiceLocator를 통해 영역 관리자를 가져올 수 있으며 뷰를 영역 이름에 등록 할 수 있습니다. 이런 방식으로, Shell 프로젝트는 뷰에 대한 직접 참조를 포함 할 필요가 없습니다.

+0

감사합니다 moran-moshe, 위의 모듈 (_TestControlA_ 및 _TestControlB_)이 올바르게 등록되었습니다. 뷰가 _IRegion_ "TabRegion"의 _Views_ 컬렉션에 올바르게 등록 된 것을 볼 수 있습니다. 나는이 점을이 게시물에서 언급했다. 내가 가지고있는 문제는 ** Shell ** Project에 있습니다. 여기서는 느슨하게 결합 된 어셈블리에 대한 참조가 없습니다. '.AddToRegion()' 메소드 구문은 뷰가 삽입 될 영역의 이름 (TabRegion)과 뷰의 이름을 요청합니다. 그 견해는 제가 도달 할 수없는 것입니다. – user3235445

+0

예를 들어 Unity를 사용하면 각 컨트롤 (TestControlA 및 TestControlB)에서 IRegionManager를 가져 와서 뷰를 영역에 추가 할 수 있습니다. 귀하의 모든 의견은 지역 이름입니다. –

+0

지금 보았던 _TabRegion_ 영역에 새 뷰를 주입하려는 MainMenu 이벤트에 쉘을 가입 시켰습니다. 셸에서 구독을 제거한 후 TestModelA 및 TestModelB ViewModels에서 동일한 이벤트를 구독합니다. 여기에서 알려진 _TabControl_ 영역에보기를 추가합니다. 이것은 매력처럼 작동합니다. 고마워요. 나는 기꺼이 대답으로 당신의 도움을 투표, 좋은 하루 되세요! – user3235445