Prism之初识

 

   首先,简单地介绍说一下单一应用程序与复合应用程序。

一、单一应用程序

                                   

                       

看看上面这张图片,假如我们当前的需求是实现主界面如图所示。如果将其构建成具有用户控件的传统 WPF 应用程序,首先应构建一个顶层窗口并针对上述各个功能添加用户控件。在这种情况下,我们需要实现以下用户控件:PositionGrid、PositionSummary、TrendLine 和 WatchList等等。然后,使用 RoutedEvents、RoutedCommands 和数据绑定将所有内容连接起来。

在这种情况下,应用程序与每个控件都紧密耦合在一起,UI 中存在大量用于协调各个部分的逻辑,控件之间还存在着相互依赖关系。如何解决这些问题?接下来看介绍一下复合应用程序。

 

二、复合应用程序

复合应用程序由运行时动态发现和构成的松散耦合模块组成。模块包含代表系统的不同垂直片段的可视和非可视组件,可视组件(视图)被组合在一个常规外壳中,可用作应用程序所有内容的宿主。复合应用程序可提供各种服务,将这些模块级组件结合在一起,模块可提供与应用程序的特定功能相关的其他服务。

                                  

 

从较高的层次来看,复合应用程序是“复合视图”设计模式的实现,此模式可描述包含子项的视图的递归 UI 结构,这些子项本身也是视图。这些视图然后通过某种机制组合起来 — 通常是在运行时而非设计时静态组合。

接下来介绍的Prism则是一个实现复合应用程序的框架!

 

三、Prism

根据上图,我们可以了解到复合应用程序包含三个模块:Shell、模块和视图,既然Prism是一个实现复合应用程序的框架,那么也应该包括这三个模块。

    1.Shell

在Prism中,在启动应用之前,需要进行一系列初始化工作(注册Module等),需要将MainWindow删除掉,同时删除App.xmal中的StartUpUri,创建Shell,主应用程序容器。同时创建Bootstrapper.cs并实现接口UnityBootstrapper,在其中实现抽象方法CreateShell.

   

 class Bootstrapper : UnityBootstrapper
    {
        protected override DependencyObject CreateShell()
        {
            return Container.Resolve<Shell>();
        }

        protected override void InitializeModules()
        {
            base.InitializeModules();
            App.Current.MainWindow = (Shell)Shell;
            App.Current.MainWindow.Show();
        }

        protected override void ConfigureModuleCatalog()
        {
            base.ConfigureModuleCatalog();
            ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;

            moduleCatalog.AddModule(typeof(PrismApp.ModuleExample.HelloWorldModule));
            moduleCatalog.AddModule(typeof(PrismApp.Module.HelloPrismModule));
        }


在App.cs中重载OnStartup,并通过Bootstrapper中的Run函数来启动程序

 protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            Bootstrapper bootstrapper = new Bootstrapper();
            bootstrapper.Run();
        }

 

     2.Module

    Module,程序的组成模块。实现IModule接口。

 public class HelloPrismModule:IModule
    {
         private readonly IRegionViewRegistry regionViewRegistry;

         public HelloPrismModule(IRegionViewRegistry registry)
        {
            this.regionViewRegistry = registry;
        }

        public void Initialize()
        {
            regionViewRegistry.RegisterViewWithRegion("NextRegion", typeof(PrismApp.HelloPrismModule.HelloPrismModuleView));
        }
    }

并在Bootstrapper.cs中ConfigrueModuleCatalog方法中进行注册

   protected override void ConfigureModuleCatalog()
        {
            base.ConfigureModuleCatalog();
            ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;

            moduleCatalog.AddModule(typeof(PrismApp.ModuleExample.HelloWorldModule));
            moduleCatalog.AddModule(typeof(PrismApp.Module.HelloPrismModule));
        }

 

 

 

     3.Region

     Region,内容区域,可以提供各个模块加载所需的视图,Prism默认提供三种Region,分别是ContentControl、ItemsControl和Selector.我们也可以自定义Region(下一节介绍)。通过附加属性来设置RegionManager.RegionName

 

<Window x:Class="PrismApp.Shell.Shell"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:cal="http://www.codeplex.com/prism"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <ContentControl Name="MainRegion"  cal:RegionManager.RegionName="MainRegion" ></ContentControl>
        <ContentControl Name="NextRegion" Grid.Row="1" cal:RegionManager.RegionName="NextRegion" ></ContentControl>
    </Grid>
</Window>


并在每个Module的Initalize方法对Region进行注册

  public void Initialize()
        {
            regionViewRegistry.RegisterViewWithRegion("MainRegion", typeof(PrismApp.ModuleExample.HelloWorldModuleView));
        }

 

 

 

总结

         本文主要是介绍了单一应用程序与复合应用程序。初步介绍了Prism以及Prism的三个点:Shell、Module和Region,接下来会根据Prism的源码对这个Prism进行详细的介绍。

转载于:https://www.cnblogs.com/ForOne/p/3938435.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Prism库提供了一种称为"dispatch"的机制,用于在UI线程上自动分发事件。通过使用Prism的事件聚合器(EventAggregator)和订阅者模式,可以实现此功能。 在Prism中,发布者通过调用EventAggregator的Publish方法来引发事件。订阅者可以通过在订阅期间指定ThreadOption.UIThread来自动在UI线程上接收事件。这意味着当事件被发布时,订阅者的事件处理程序将在UI线程上执行,从而避免了在非UI线程上更新UI的问题。 以下是一个示例代码,演示了如何在Prism中使用dispatch机制: ```csharp // 发布者 public class TickerSymbolSelectedEvent : PubSubEvent<string> { } public class MainPageViewModel { private readonly IEventAggregator _eventAggregator; public MainPageViewModel(IEventAggregator eventAggregator) { _eventAggregator = eventAggregator; } public void PublishEvent(string message) { _eventAggregator.GetEvent<TickerSymbolSelectedEvent>().Publish(message); } } // 订阅者 public class MainWindowViewModel { public MainWindowViewModel(IEventAggregator eventAggregator) { eventAggregator.GetEvent<TickerSymbolSelectedEvent>().Subscribe(ShowNews, ThreadOption.UIThread); } private void ShowNews(string message) { MessageBox.Show(message); } } ``` 在上面的示例中,MainPageViewModel是一个发布者,它通过调用EventAggregator的Publish方法来引发TickerSymbolSelectedEvent事件。MainWindowViewModel是一个订阅者,它通过调用EventAggregator的Subscribe方法来订阅TickerSymbolSelectedEvent事件,并在订阅期间指定ThreadOption.UIThread,以确保ShowNews方法在UI线程上执行。 通过使用Prism的dispatch机制,可以方便地在Prism应用程序中处理UI线程上的事件分发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值