prism 모듈 화 문제 총화 (1)

3160 단어 WPF 기술 류
prism 모듈 화 시 IRegion 은 View 와 Remove 를 추가 하 는 방법 을 제공 합 니 다. 다음 에 발생 할 문제 에 대해 토론 하 겠 습 니 다.
다음은 Demo 의 Shell, 하나의 Menu 의 Region, 두 개의 내용 구역 입 니 다.


    
        
        
        
        
    

 

动态加载模块UI


问题:多个模块组成在一起,不可能是同时初始化时,全部加载的.如下图,模块未加载之前.

点击菜单加载一个登录的模块以后,如下图

解决办法:模块初始化时,不要加载页面,注册模块的相关服务即可.

 

多个区域同时加载同个模块

如下面左右两个区域加载了同个登录控件.

问题:在我们注册对象时,一个控件实例是无法同时在两个区域中的.如果系统用这种同个区域使用多个模块的话,则不要注册单一实例,如

_unityContainer.RegisterType(new ContainerControlledLifetimeManager());
_regionManager.Regions["LeftRegion"].Add(_unityContainer.Resolve());
_regionManager.Regions["RightRegion"].Add(_unityContainer.Resolve());

 
해결 방법: 따라서 이 모듈 을 불 러 올 때 불 러 오 는 컨트롤 이 새로운 인 스 턴 스 임 을 보증 해 야 합 니 다.
 
 
_regionManager.Regions["LeftRegion"].Add(new LoginView());
_regionManager.Regions["RightRegion"].Add(new LoginView());

 
영역 UI 하위 영역 삽입
 
문제: 하위 컨트롤 영역 에 하위 컨트롤 을 추가 할 때 위 와 같이 다시 예화 해 야 합 니 다.
//second time will throw exception
_regionManager.AddToRegion("LoginRegion", _unityContainer.Resolve());

 
LoginRegionView 를 제거 한 후에 도 HelloWorldView 는 용기 에 존재 합 니 다.
해결 방법:
(1) 같은 경우 에 도 새로운 인 스 턴 스 대상 이 필요 합 니 다. (2) LoginRegionView 도 용기 에 존재 합 니 다. 이 문 제 를 해결 할 수 있 지만 여러 영역 에서 같은 모듈 을 동시에 불 러 오 는 수요 에 부합 되 지 않 습 니 다.
UI 인터페이스 영역 추가 지연
ui 를 불 러 오 는 것 은 불 러 오 는 것 을 지연 시 키 는 것 이 좋 습 니 다. (필요 에 따라 불 러 오 는 것) 프로그램의 초기 화 와 실행 속도 가 빨 라 집 니 다. 가끔 은 오류 가 발생 하여 한 지역 에 뷰 를 추가 합 니 다.
MenuItem 을 누 르 면 View 를 추가 합 니 다. 이 View 는 MenuItem 의 Click 이벤트 가 실 행 된 후에 야 초기 화 됩 니 다. 다음 코드:
private void AddViewToRegion(object view)
{
    MenuItem regionItem = new MenuItem() { Header = "    " };
    regionItem.Click+=new RoutedEventHandler((o,e) =>
    {
        _regionManager.Regions["region"].Add(view);
    });
}

그 다음 에 호출 되 었 습 니 다. 들 어 오 는 매개 변 수 는 UserControl 입 니 다. 여기 서 매개 변 수 를 들 어 올 때 초기 화 되 었 습 니 다. 요구 에 부합 되 지 않 습 니 다.
AddViewToRegion(new HelloWorldView());

Func 범용 의뢰 로 초기 화 지연
현재 코드 는 다음 과 같 습 니 다:
private void AddViewToRegion(Func view)
{
    MenuItem regionItem = new MenuItem() { Header = "    " };
    regionItem.Click+=new RoutedEventHandler((o,e) =>
    {
        _regionManager.Regions["region"].Add(view());
    });
}
AddViewToRegion(() => new HelloWorldView());

좋은 웹페이지 즐겨찾기