Prism은 어떻게 View를 다른 View로 변경하는가
전 포스팅에서 다뤘듯이 RegionManager를 통해 등록명으로 접근 view를 출력 시킬 수 있다는 것을 알 수 있었다.
그러면 응용으로 런타임시에 view를 바꿀 수 있지 않을까?
https://github.com/2Bbear/WindowsProgrmaDevelop/tree/master/WPF/UsingMvvmPrismLibrary/06-ViewActivationDeactivation
코드 참조는 이곳에서 하면 된다
1 2 3 4 5 6 7 8 9 10 11 12 | public partial class App : PrismApplication { protected override Window CreateShell() { return Container.Resolve<MainWindow>(); } protected override void RegisterTypes(IContainerRegistry containerRegistry) { } } | cs |
app에서 Mainwindow를 실행시키게 해놓았다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | public partial class MainWindow : Window { IContainerExtension _container; IRegionManager _regionManager; IRegion _region; ViewA _viewA; ViewB _viewB; public MainWindow(IContainerExtension container, IRegionManager regionManager) { InitializeComponent(); _container = container; _regionManager = regionManager; this.Loaded += MainWindow_Loaded; } private void MainWindow_Loaded(object sender, RoutedEventArgs e) { _viewA = _container.Resolve<ViewA>(); _viewB = _container.Resolve<ViewB>(); _region = _regionManager.Regions["ContentRegion"]; _region.Add(_viewA); _region.Add(_viewB); } private void Button_Click(object sender, RoutedEventArgs e) { //activate view a _region.Activate(_viewA); } private void Button_Click_1(object sender, RoutedEventArgs e) { //deactivate view a _region.Deactivate(_viewA); } private void Button_Click_2(object sender, RoutedEventArgs e) { //activate view b _region.Activate(_viewB); } private void Button_Click_3(object sender, RoutedEventArgs e) { //deactivate view b _region.Deactivate(_viewB); } } | cs |
Mainwindow를 확인하면
생성자로 받을 컨테이너와 리전매니저를 저장할 멤버변수가 보이고
Loaded 이벤트에 Mainwindow_Loaded 메소드가 붙어있는 것을 확인 할 수 있다.
Loaded 이벤트는 윈도우가 로드 될때 실행되는 이벤트로 그러한 의미에서
MainWindow_Loaded는 윈도우가 실행될때 실행되게 되는 메소드다. 왜 굳이 loaded에 놓았을까?...
Loaded 메소드는 생성자의 InitializeComponent에서 Loaded를 실행시킨다.. 아니면 누가 알주세요.
따라서 InitialzeComponent가 된 후에 Loaded를 한다는 것은....xaml이 실행되기 전에 load를 연결시키겠다는 의미로 보인다.
이후 Mainwindow_Loaded 메소드를 확인하면 배주에 regionManager에서 region을 호출하여 _region에 담는다.
그렇기에 구조가
_regionManager
-> region["ContentRegion"] = _region
-> _viewA
-> _viewB
이런 식으로 구조가 만들어지게 된다.
_region을 포인터용으로 사용하여 만들어진 region["ContentRegion"] 에 접근하여 view를 추가하는 행위이다.
두개 이상의 view가 하나의 region에 연결되어 있는 경우 기본적으로 제일먼저 붙은 view가 실행되겠지만
region.Activate로 출현할 view를 선택할 수 있다.
아무래도 구조가
_regionManger
->region["ContentRegion"] = _region
->_viewA , true
->_viewB , false
이런 형태로 되어 있는 것 같고,
_region.Activate(view)를 이용하여 해당 region["ContentRegion"] 에서 value값으로 view와 같은 녀석을 검색하고
찾았다면 해당 view의 bool 값을 true로 바꾸고 나머지를 false로 바꾸어 출력 가능 대상을 바꾸는 것 같다.
'중단한 프로젝트 > WPF_PrismLibrary(추후진행)' 카테고리의 다른 글
Prism으로 어떻게 다른 모듈의 view를 호출하는가 (0) | 2019.02.19 |
---|---|
Prism은 어떻게 모듈을 관리하는가 (0) | 2019.02.19 |
Prism은 어떻게 View상호작용 view를 호출하는가 (0) | 2019.02.19 |
Prism은 어떻게 View에서 View를 호출하는가 - ViewDiscovery (0) | 2019.02.19 |
Region이란 무엇인가 (0) | 2019.02.19 |