Prism으로 어떻게 다른 모듈의 view를 호출하는가
지난번 모듈 예제를 그대로 설명하려한다.
https://github.com/2Bbear/WindowsProgrmaDevelop/tree/master/WPF/UsingMvvmPrismLibrary/HowToPrismModules
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 | using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Linq; using System.Threading.Tasks; using System.Windows; using Prism.Ioc; using Prism.Unity; using HowToPrismModules.Views; using Prism.Modularity; using JJHModule; namespace HowToPrismModules { /// <summary> /// App.xaml에 대한 상호 작용 논리 /// </summary> public partial class App : PrismApplication { protected override Window CreateShell() { Console.WriteLine("JJH: App CreateShell"); return Container.Resolve<MainWindow>(); } protected override void RegisterTypes(IContainerRegistry containerRegistry) { // // } protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) { var moduleAType = typeof(Class1); moduleCatalog.AddModule(new ModuleInfo() { ModuleName = moduleAType.Name, ModuleType = moduleAType.AssemblyQualifiedName, InitializationMode = InitializationMode.OnDemand }); } } } | cs |
시작 윈도우로 Mainwindow를 설정하고
Bootstrapper에서 초기화를 시도하는 configureModuleCatalog메소드를 오버라이딩 한다.
1 2 3 4 5 6 7 8 9 10 11 | <prism:PrismApplication x:Class="HowToPrismModules.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:HowToPrismModules" xmlns:prism="http://prismlibrary.com/" > <Application.Resources> </Application.Resources> </prism:PrismApplication> | cs |
혹여나 실행이 안되면 xml부분을 잘 확인하자
<prism:PrismApplication 이라는 점과 xmlns:prism이라는 네임스페이스를 받아오는 것에 유의하면 된다.
configureModuleCatalog 메소드에는 다른 모듈의 class1을 참조하기 위하여
이렇게 참조 추가를 해주어야 한다.
특히 만들어지는 JJHModule, 즉 다른 모듈의 경우 클래스라이브러리 형태의 프로젝트로 만들어야지 참조하기 편하다. 원래 클래스 라이브러리가 맞기도 하고...
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 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; using Prism.Modularity; namespace HowToPrismModules.Views { /// <summary> /// MainWindow.xaml에 대한 상호 작용 논리 /// </summary> public partial class MainWindow : Window { IModuleManager _moduleManager; public MainWindow(IModuleManager moduleManager) { InitializeComponent(); _moduleManager = moduleManager; } private void Button_Click(object sender, RoutedEventArgs e) { _moduleManager.LoadModule("Class1"); } } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <Window x:Class="HowToPrismModules.Views.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:HowToPrismModules.Views" xmlns:prism="http://prismlibrary.com/" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <Button Click="Button_Click" Content="Button" HorizontalAlignment="Left" Height="96" Margin="248,109,0,0" VerticalAlignment="Top" Width="157"/> <ContentControl prism:RegionManager.RegionName="ContentRegion"/> </Grid> </Window> | cs |
이제 메인윈도우에서 해당 View를 가져와야하니 클래스를 이렇게 선언해주고
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 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Prism.Ioc; using Prism.Modularity; using Prism.Regions; namespace JJHModule { public class Class1 : IModule { public void OnInitialized(IContainerProvider containerProvider) { var regionManager = containerProvider.Resolve<RegionManager>(); regionManager.RegisterViewWithRegion("ContentRegion",typeof(Views.ViewA)); } public void RegisterTypes(IContainerRegistry containerRegistry) { } } } | cs |
모듈 쪽의 클래스는 이렇게 만들어 놓아야 한다.
간단하게 OnInitialized라는 메소드가 하는 일은 단순히 RegionManager에 자신의 View를 추가하는 일밖에 하지 않는다.
이후 MainWindow에서는 이 RegionManger를 호출하여 등록명을 불르면 해당 View가 출현되는 방식이다.
'중단한 프로젝트 > WPF_PrismLibrary(추후진행)' 카테고리의 다른 글
Prism에서 DelegateCommand를 하는 방법 (0) | 2019.02.20 |
---|---|
Prism에서 CustomViewModel을 view에 붙이는 방법 (0) | 2019.02.19 |
Prism은 어떻게 모듈을 관리하는가 (0) | 2019.02.19 |
Prism은 어떻게 View를 다른 View로 변경하는가 (0) | 2019.02.19 |
Prism은 어떻게 View상호작용 view를 호출하는가 (0) | 2019.02.19 |