2017-02-16 3 views
-2

뷰에 등록해야하는 영역을 알 수 있도록 영역 이름을 모듈에 전달할 수 있습니까?방법 : 런타임에 뷰를 등록 할 영역을 모듈에 알리기

많은 코드 예제에서 regionName이 모듈 초기화 메소드에서 하드 코드되었음을 알 수 있습니다.

모듈에서 영역에 뷰를 등록 할 때 영역 이름에 SHELL을 전달하고 싶습니다.

이것이 가능하지 않거나 권장되지 않는 경우 왜 이것이 좋지 않거나 좋은 것입니까?

+1

셸이 모든 영역 이름을 모듈에 "전달하지"않습니다. 쉘 *은 어떤 모듈이 뷰를 삽입 할 수있는 영역을 정의합니다. 당신이하려는 것을 이해하지 못하지만, 잘못된 접근법처럼 들립니다. – mm8

+0

동일한 모듈 뷰의 인스턴스를 두 개 이상 동일한 쉘에로드하는 방법은 무엇입니까? 예를 들어, "Part Entry"모듈이 있고 사용자가 원하는만큼의 인스턴스를 허용하려는 경우. 각 인스턴스는 도킹 가능한 탭에로드됩니다. – Arcadian

+0

과 유사합니다. http://4-getful.blogspot.com/2010/04/ensuring-your-prism-modules-can-load.html – Arcadian

답변

-1

나, 그리고 다른 사람들은 어떻게 든 설정/통과되는 마법 문자열을 피하는 아이디어를 처리합니다. 문자열의 저장을 중앙 집중화하여 다른 장소에서 참조 할 수 있습니다.

먼저 문자열을 저장할 클래스가 필요합니다. 내 프리즘 ... 영역 ... 이름에 RegionNames이라는 이름을 사용합니다. 아래 예가 있습니다. 이 모든 다른 어셈블리가 아래처럼 사용할 수 있습니다, 참조 할 수 어셈블리와 같은 솔루션의 중앙 위치에 설치하면

namespace Application.Shared 
{ 
    public class RegionNames 
    { 
     // Main window regions 
     public static string RibbonRegion { get { return "RibbonRegion"; } } 
     public static string TitleBarRegion { get { return "TitleBarRegion"; } } 
     public static string ToolBarRegion { get { return "ToolBarRegion"; } } 
     public static string DashboardRegion { get { return "DashboardRegion"; } } 
     public static string ContentRegion { get { return "ContentRegion"; } } 
    } 
} 

.

using Application.Shared; 

namespace Application.Modules 
{ 
    public class ModuleX : IModule 
    { 
    private readonly IUnityContainer _container; 
    private readonly IRegionManager _region_manager; 

    public ModuleX (IUnityContainer container, IRegionManager region_manager) 
     { 
     _container = container; 
     _region_manager = region_manager; 
     } 
     public override void Initialize() 
     { 
      _region_manager.RegisterViewWithRegion(RegionNames.RibbonRegion, typeof(ToolViewX)); 
      _region_manager.RegisterViewWithRegion(RegionNames.ContentRegion, typeof(FinderViewX)); 
     } 
    } 
} 

는만큼 클래스가 RegionNames 클래스가 사용하는 네임 스페이스에 액세스 할 수 있습니다, 그들은 정적 속성에 액세스 할 수 있습니다. 이런 식으로 전달할 것이 없습니다.

이 기술은 Prism 또는 C#! 모든 프로그래밍 언어에서이 패턴을 사용할 수 있습니다. RegionNames에 전화하는 대신 StringBag이나 뭐든지 부르세요.

희망이 도움이됩니다.

+0

감사합니다. 런타임 중에 다른 regionname을 원하면 어떻게해야합니까? 예를 들어, 동일한 모듈의 두 인스턴스를로드하려면 두 개의 서로 다른 지역 이름이 있어야합니다. – Arcadian

+0

나는이 사람들이 올바른 생각을 가지고 있다고 생각한다. http://4-getful.blogspot.com/2010/04/ensuring-your-prism-modules-can-load.html – Arcadian

+0

차이점에 대한보기를 표시하려면 지역에서 런타임에, 당신은 RequestNavigate를 통해 할 수 있습니다. http://prismlibrary.readthedocs.io/en/latest/WPF/08-Navigation/#view-based-navigation 컴파일시 돌로 설정하지 않아도됩니다. 거의 7 년 전 블로그 게시물을 실제로 인용 하시겠습니까? 그 나쁜 예입니다. –

0

가장 좋은 방법은 지역 이름을 관리하고이를 모듈에 주입하는 것입니다.

IRegionNameService 
{ 
    string MainRegion {get;} 
    string DetailRegion {get;} 
} 

은 컨테이너와 싱글로 서비스를 등록, 지금 당신은 모듈이로드 된 응용 프로그램 출시 및 전 때 당신이 그것을 원하는대로 구성 할 수 있습니다.

+0

지금 EventService를 사용하여 종료되었습니다. 그러나 여전히 해결책에 만족하지 않습니다. – Arcadian