문제

에서 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;
     }
}

이제 두 가지가 있습니다.

  1. 내 셸에서 메뉴를 만드는 데 사용할 수 있는 ViewStore입니다.
  2. 모듈이 단순한 ModuleDependency 이상을 결합하지 않고 다른 모듈이 소유한 뷰를 열 수 있는 방법입니다. 실제로는 ModuleDependency도 필요하지 않지만 아마도 정확할 것입니다.

분명히 이 방법은 상황을 지나치게 단순화합니다.뷰가 메뉴 항목이어야 하는지 여부를 나타내는 항목이 있습니다.내 앱에는 여러 메뉴 등이 있지만 이것이 기본이므로 계속 진행해야 합니다.

또한 Stackoverflow에 답변을 얻을 수 있는 약간의 기회를 주어야 합니다...3시간밖에 안 주셨고 포기하셨어요 :)

도움이 되었기를 바랍니다.

다른 팁

RegisterViewWithRegion에는 뷰 이름을 매개변수로 허용하는 오버로드가 없습니다.이렇게 하면 모듈 통합이 쉬워질 수 있습니다.작업 항목을 추가했습니다. 코드플렉스

현재 저는 뷰 주입을 위한 다른 모듈에 대한 참조를 추가하고 있으며 프리즘의 느슨하게 결합된 특성을 잃습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top