CompositeWpf라고도 불리는 Prism의 애플리케이션과 모듈 통합
-
13-09-2019 - |
문제
에서 MSDN:
모듈에 있는 대부분의 보기는 직접 표시될 필요가 없고 사용자의 일부 작업 후에만 표시될 수 있습니다.애플리케이션 스타일에 따라 사용자가 보기에 액세스할 수 있도록 메뉴, 도구 모음 또는 기타 탐색 전략을 사용할 수 있습니다.모듈의 초기화 방법에서 애플리케이션의 탐색 구조에 등록할 수도 있습니다.탐색 구조의 이벤트 핸들러에서(즉, 사용자가 메뉴 항목을 클릭할 때) 뷰 삽입 기술을 사용하여 적절한 영역에 뷰를 추가할 수 있습니다.
비슷한 시나리오가 있는데 RegisterViewWithRegion을 사용하여 모듈의 초기화 메서드에서 영역에 뷰를 추가하고 있습니다.메뉴(다른 모듈)와의 보기 기반 사용자 상호 작용을 표시하고 싶습니다.
Prism에서 모듈의 분리된 동작을 깨지 않고 이 동작을 달성하려면 어떻게 해야 합니까?
ModuleB의 ModuleA와 같이 지역에 추가된 보기를 활성화/표시할 수 있습니까?
해결책
내가 하는 일은 다음 인터페이스를 사용하여 Shell에 보기 레지스트리를 만드는 것입니다(여기에서는 단순화하고 있습니다).
public interface IViewRegistry
{
void RegisterView(string title, string key, Func<UIElement> viewCreationMethod);
void OpenView(string key);
}
이것은 지나치게 단순화되었지만 희망적으로 이것이 당신에게 그림을 제공하기를 바랍니다.각 모듈은 초기화 시 이 인터페이스를 사용하여 셸에 해당 뷰를 등록합니다.내 셸에서는 이러한 항목을 저장하는 ViewStore를 만듭니다.
public static class ViewStore
{
public Dictionary<string, ViewEntry> Views { get; set; }
static ViewStore()
{
Views = new Dictionary<string, ViewEntry>();
}
public void RegisterView(string name, string key, Func<UIElement> createMethod)
{
Views.Add(key, new ViewEntry() { Name = name, CreateMethod = createMethod });
}
}
그런 다음 내 IViewRegistry 구현에서 다음을 수행합니다.
public class ViewRegistryService : IViewRegistry
{
public void RegisterView(string title, string key, Func<UIElement> createMethod)
{
ViewStore.RegisterView(title, key, createMethod);
}
public void OpenView(string key)
{
//Check here with your region manager to see if
//the view is already open, if not, inject it
var view = _regionManager.Regions["MyRegion"].GetView(key);
if(view != null)
{
view = ViewStore.Views[key]();
_regionManager.Regions["MyRegion"].Add(view, key);
}
_regionManager.Regions["MyRegion"].Activate(view);
}
private IRegionManager _regionManager;
public ViewRegistryService(IRegionManager rm)
{
_regionManager = rm;
}
}
이제 두 가지가 있습니다.
- 내 셸에서 메뉴를 만드는 데 사용할 수 있는 ViewStore입니다.
- 모듈이 단순한 ModuleDependency 이상을 결합하지 않고 다른 모듈이 소유한 뷰를 열 수 있는 방법입니다. 실제로는 ModuleDependency도 필요하지 않지만 아마도 정확할 것입니다.
분명히 이 방법은 상황을 지나치게 단순화합니다.뷰가 메뉴 항목이어야 하는지 여부를 나타내는 항목이 있습니다.내 앱에는 여러 메뉴 등이 있지만 이것이 기본이므로 계속 진행해야 합니다.
또한 Stackoverflow에 답변을 얻을 수 있는 약간의 기회를 주어야 합니다...3시간밖에 안 주셨고 포기하셨어요 :)
도움이 되었기를 바랍니다.
다른 팁
RegisterViewWithRegion에는 뷰 이름을 매개변수로 허용하는 오버로드가 없습니다.이렇게 하면 모듈 통합이 쉬워질 수 있습니다.작업 항목을 추가했습니다. 코드플렉스
현재 저는 뷰 주입을 위한 다른 모듈에 대한 참조를 추가하고 있으며 프리즘의 느슨하게 결합된 특성을 잃습니다.