2010-03-19 4 views
9

나는 너무 과도하게 생각뿐만 아니라이군요 그곳이 될 수 나를 수 있도록보다 조금 더 착물 프리즘 framework.Its를 사용하여 뷰를 오버레이와 도움이 필요 (wpf 창) 및 2보기 (A & B - 두 usercontrols) 모듈에 있습니다. 셸을로드하면보기 A가로드됩니다.보기 A에는 일부 사용자 입력에 대해 "팝업"보기 B 이 있습니다. 그래서 자연스럽게 나는 일종의 모달 윈도우/컨트롤, 어쩌면 팝업까지 생각할 것이다. 그러나 팝업 문제는 내가 쉘을 움직이면 팝업이 고정되어 있고보기 A에서 이벤트를 차단하지 않는다는 것입니다.보기 A를 사용 중지하면 이벤트가 중지되고 i도 사용하려고했습니다. 보기 B가 쉘과 함께 움직 이도록하십시오. 캔버스 만 작동하지만 이제는이를 막을 방법이 필요합니다. ' 어쨌든 프리즘이있는 다른 뷰 위에 뷰를 오버레이 할 수 있습니까? 또는 다른 사람들이 프리즘 & wpf와 함께 모달 팝업을 만드는 방법은 무엇입니까? 어떤 조언이나 조언을 주시면 감사하겠습니다.WPF와 프리즘보기 오버레이

답변

13

끼워 넣기 대화 상자를 별도의 창없이 사용하려면 Prism의 RegionManager를 사용하여 윤곽선을 그릴 수 있습니다. 트릭은 시각적 트리에서 주요 영역으로 팝업 지역 평행을 넣어하는 것입니다

<Grid> 
    <ContentControl cal:RegionManager.RegionName="MainRegion" IsEnabled={Binding IsNoPopUpActive} /> 
    <ContentControl cal:RegionManager.RegionName="PopUpRegion"/> 
</Grid> 

는 이제 "MainRegion"으로보기 "A"를 넣어 RegionManager를 사용합니다. IPopUpDialogController와 비슷한 컨트롤러 클래스를 만듭니다. 필요에 따라 뷰 "B"(또는 응용 프로그램의 다른 PopUpView)를 "PopUpRegion"에 넣어야합니다. 추가적으로 기본 "MainRegion"이 활성화 또는 비활성화되도록 신호를 보내는 플래그를 제어해야합니다. 이렇게하면 팝업이 닫힐 때까지 사용자가보기 "A"의 컨트롤을 사용하여 재생할 수 없습니다.

프레임을 Dispatcher로 보내기 전에 ComponentDispatcher.PushModal()을 사용하여 모달 방식으로 수행 할 수도 있습니다. 그러나 모달 대화 상자는 사용하지 않는 것이 좋습니다.


업데이트 : 주석의 요청으로, IsNoPopUpActive 등판 뷰 모델에서 구현 될 수있다. 거기 당신은 팝업 지역 RegionManager의보기 컬렉션에 연결할 수 :

public bool IsNoPopUpActive 
{ 
    get { return _regionManager.Regions["PopUpRegion"].Views.Count() == 0; } 
} 

것은 당신의 의견 수집을 (팝업을 추가/제거)를 수정 자마자하여 PropertyChanged 이벤트를 트리거해야합니다.

: 요즘에는 백그라운드에서 컨트롤을 비활성화하지 않고 대신 투명 패널을 삽입합니다. 이렇게하면 배경 컨트롤을 클릭하지 않아도됩니다. 그러나 키보드 입력 (컨트롤 탭)은 처리하지 않습니다. 키보드 입력을 수정하려면 키보드 포커스가 (MSDN on WPF Focus concepts) 팝업에이 트랩되어 있는지 확인해야합니다.

다음 초점을 추가하면 트릭을 할해야 팝업 지역 특성 : 당신은 프리즘과 WPF + MVVM을 사용하는 경우

KeyboardNavigation.DirectionalNavigation="None" 
KeyboardNavigation.ControlTabNavigation="None" 
KeyboardNavigation.TabNavigation="Cycle" 
KeyboardNavigation.TabIndex="-1" 
+0

감사를하는 데 도움이! 나는 실제로 그것을 다른 방식으로했지만 당신과 매우 비슷합니다. 내가 셸 영역에 콘텐트 컨트롤을 사용하고 모듈 A에서 아이템 컨트롤 영역을 만들었습니다. 아이템 컨트롤 영역에서 그리드를 사용하도록 레이아웃을 설정했습니다. 그리고 모든 것은 "팝업"영역 내에서 활성 뷰와 비활성화 뷰를 활성화 시켰습니다. 당신의 해결책을 시험해 볼 것입니다. 결과에 대한 피드백을 제공합니다. 다시 한 번 감사드립니다! – Zaheer

+0

안녕하세요 Olli, "IsNoPopUpActive"속성을 포함하는 방법에 대한 스 니펫을 제공 할 수 있습니까? – ioWint

+0

안녕하세요 ioWint, 답변을 업데이트했습니다. –

2

이 메시지보기 오버레이 컨트롤러 좀 걸릴 수 있습니다. 이 접근 방식의 좋은 점은 모의 오버레이 컨트롤러를 사용하여 모델을보고 단위 테스트를 작성하고 모의 컨트롤러가 사용자가 오버레이에서 선택할 결과를 반환하도록 할 수 있다는 것입니다.

여기에서 찾을 수 있습니다 : http://presentationlayer.wordpress.com/2011/05/24/wpf-overlay-message-view-controller/

희망이 매우

관련 문제