Prism基础知识 学习Region

Posted 聆听微风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Prism基础知识 学习Region相关的知识,希望对你有一定的参考价值。

Prism基础知识 学习(一)Region

首先如果不采用Prism 的方法,这个案例我们该怎么写:

首先在MainWindow.cs中

<Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <StackPanel Orientation="Horizontal">
            <Button
                Margin="10"
                Command="Binding OPenCommand"
                CommandParameter="ViewA"
                Content="打开模块A" />
            <Button
                Margin="10"
                Command="Binding OPenCommand"
                CommandParameter="ViewB"
                Content="打开模块B" />
            <Button
                Margin="10"
                Command="Binding OPenCommand"
                CommandParameter="ViewC"
                Content="打开模块C" />
        </StackPanel>
        <ContentControl Grid.Row="1" Content="Binding Body" />
    </Grid>

然后在ViewA.xml中编写,ViewB.xml,ViewC.xml同理

<TextBlock FontSize="60" Text="我是模块A" />

在MainWindowViewModel.cs中写

public class MainWindowViewModel : BindableBase
    
        private string _title = "Prism Application";

        public DelegateCommand<string> OPenCommand  get; set; 

        public string Title
        
            get  return _title; 
            set  SetProperty(ref _title, value); 
        

        private object body;

        public object Body
        
            get  return body; 
            set
            
                body = value;
                RaisePropertyChanged();
            
        

        public MainWindowViewModel()
        
            OPenCommand = new DelegateCommand<string>(Open);
        
        private void Open(string obj)
        
            switch (obj)
            
                case "ViewA": Body = new ViewA(); break;
                case "ViewB": Body = new ViewB(); break;
                case "ViewC": Body = new ViewC(); break;

            
        
    
  1. 首先MainWindow中的button绑定了OPenCommand委托,传入了CommandParameter参数。
  2. 在MainWindowViewModel中,声明了DelegateCommand OPenCommand get; set; 委托,然后该委托调用了Open()方法。
  3. 这个方法打开ViewA等窗体。窗体打开在ContentControl控件中。

这种写法的不足在哪里?

  1. 如果后续需要打开的View窗体变多,就需要不断的维护MainWindowViewModel与MainWindow文件。

基于Prism的写法(依赖注入)(动态添加实例)

修改ContentControl组件,这里修改为prism:RegionManager.RegionName

        <ContentControl Grid.Row="1" prism:RegionManager.RegionName="ContentRegion"/>

然后在App.xml中注册

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        
            containerRegistry.RegisterForNavigation<ViewA>();
            containerRegistry.RegisterForNavigation<ViewB>();   
            containerRegistry.RegisterForNavigation<ViewC>();
        

然后在MainWindowViewModel.xaml中,添加regionManager。修改初始化方法,绑定regionManager。

主要是修改Open方法,不再需要使用switch来进行选择

        private readonly IRegionManager regionManager;

        public MainWindowViewModel(IRegionManager regionManager)
        
            OPenCommand = new DelegateCommand<string>(Open);
            this.regionManager = regionManager;
        


        private void Open(string obj)
        
            regionManager.Regions["ContentRegion"].RequestNavigate(obj);
        

以上是关于Prism基础知识 学习Region的主要内容,如果未能解决你的问题,请参考以下文章

Prism入门之区域(Region)管理

Prism 源码解读2-View的加载和控制

03Prism WPF 入门实战 - Region

Prism 源码解读2-View的加载和控制

Prism 源码解读1-Bootstrapper和Region的创建

Prism框架中View与Region关联的几种方式