精华内容
下载资源
问答
  • wpfprism框架实例代码

    2017-09-05 15:37:29
    wpf 使用微软prism框架加载组件实例代码,有两个module和一个主界面。主界面可以实现对dll的加载显示。实现导航功能等
  • Prism介绍

    2019-07-11 15:14:12
    介绍 Prism可以让你更容易地设计和构建丰富、灵活、易于维护的WPF桌面应用程序。使用Model-View-ViewModel(MVVM)、复合视图和包含重要体系结构设计原则的事件聚合器等设计模式,可以使用低耦合的组件创建模块化...

    介绍

    Prism可以让你更容易地设计和构建丰富、灵活、易于维护的WPF桌面应用程序。使用Model-View-ViewModel(MVVM)、复合视图和包含重要体系结构设计原则的事件聚合器等设计模式,可以使用低耦合的组件创建模块化应用程序,这些组件都可以独立开发。这些类型的应用程序称为复合应用程序。

    复合应用程序通常具有多个屏幕、丰富的用户交互和数据可视化,并且体现了重要的表示和业务逻辑。这些应用程序通常与多个后端系统和服务交互,并且使用分层体系结构,可以跨多个层进行物理部署。预计应用程序将在其整个生命周期内根据新的需求和业务机会进行显著的发展。简而言之,这些应用程序是“为持久而构建”和“为变化而构建”。不需要这些特性的应用程序可能不会从使用Prism框架中受益。

    Why Use Prism?

    设计和构建灵活的、易于维护的WPF客户机应用程序是一件具有挑战性的工作。本节介绍在构建WPF应用程序时可能遇到的一些常见问题,并描述Prism如何解决这些问题。

    通常,客户端应用程序的开发人员会面临相当多的挑战:

    1. 需求的多变:旧需求的改动和新需求的添加都需要频繁的修改程序架构。这样就要求软件架构要有足够的灵活性、程序的各个部分可以独立,这样就可以独立开发、维护和测试程序中的每个部分,又不影响其他的部分。
    2. 参与人员多,每个人职能不同:大多数企业应用程序都非常复杂,它们不止需要一个开发人员,甚至可能需要一个包括用户界面(UI)设计人员和本地化人员以及开发人员的大型开发团队。决定如何设计应用程序框架,使多个开发人员或子团队能够独立、有效地在应用程序的不同部分上工作,同时确保这些部分在集成到应用程序中时无缝地结合在一起。
    3. 传统的桌面应用程序耦合度高:以整体式的方式设计和构建应用程序可能会导致非常难以维护且效率低下的应用程序。在这种情况下,组件之间的耦合非常紧密,并且它们之间没有明显的分离。通常,以这种方式设计和构建的应用程序会遇到使开发人员生活困难的问题。很难向系统添加新功能或替换现有功能,很难在不破坏系统其他部分的情况下解决错误,并且很难测试和部署。此外,它还影响开发人员和设计人员有效协作的能力。

    解决这些挑战的一个有效方法是将应用程序划分为若干离散的、松散耦合的、半独立的组件,然后这些组件可以很容易地集成到应用程序的“Shell”中,从而形成一个完整的实现。以这种方式设计和构建的应用程序通常称为复合应用程序。

    复合应用程序有许多优点:

    1. 它们允许Module由不同的个人或子团队单独开发、测试和部署;它们还允许更容易地用新功能修改或扩展模块,从而使应用程序更容易扩展和维护。即使是单人项目,使用复合方法创建更具可测试性和可维护性的应用程序也会受益匪浅。
    2. 它们提供了一个公共的shell,该shell由各种Module贡献的UI组件组成,这些Modile以松散耦合的方式交互。这减少了由多个开发人员向UI添加新功能引起的争用,并促进了一种常见的外观。
    3. 它们促进了重用,并在应用程序的水平功能(如日志记录和身份验证)和垂直功能(如特定于应用程序的业务功能)之间实现了关注点的清晰分离。这还允许您更容易地管理应用程序组件之间的依赖关系和交互。
    4. 允许不同的个人或子团队根据他们的重点或专业知识专注于特定的任务或功能,从而帮助保持角色的分离。特别是,它在用户界面和应用程序的业务逻辑之间提供了更清晰的分离,这意味着用户界面设计者可以专注于创建更丰富的用户体验。

    综上,我们应该对Prism有一个大体的认识了。说通俗点,Prism可以将一个软件划分成多个Module,每个Module有自己独立的UI、前台逻辑和后台处理程序,同样,他们也可以由不同的人来完成开发。Module与Module之间也可以互相交互和传输数据,最后通过Prism的功能在WPF MainWIndow中将所有的Module组合到一起,就组成了一个完整的WPF程序。即使以后有添加或者修改需求,我们就可以添加或者修改新的Module来完成。

    谢谢阅读

    展开全文
  • WPF Prism框架介绍

    千次阅读 2021-03-01 16:56:25
    一、什么是Prism Prism是一个用于在 WPF、Xamarin Form、Uno 平台和 WinUI 中构建松散耦合、可维护和可测试的 XAML 应用程序框架。 二、官方地址 ...基于Prism的VisualStudio扩展包模板: Prism Template Pack,下载它后...

    WPF Prsim (一) Region
    WPF Prism(二)Module
    WPF Prism(三)ViewModelLocator
    WPF Prism(四)MVVM
    WPF Prism(五)Navigation
    WPF Prism(六)Dialog

    一、什么是Prism

    Prism是一个用于在 WPF、Xamarin Form、Uno 平台和 WinUI 中构建松散耦合、可维护和可测试的 XAML 应用程序框架。

    二、官方地址

    https://github.com/PrismLibrary/Prism

    基于Prism的VisualStudio扩展包模板: Prism Template Pack,下载它后可以快速创建基于Prism的项目。

    三、Prism框架内容

    框架中包括 MVVM、依赖注入、Command、Message Event、导航、弹窗等功能。

    四、Prism知识章节

    • 1.Region(区域管理)
    • 2.Module(模块)
    • 3.View Injection(视图注入)
    • 4.ViewModelLocationProvider(视图模型定位)
    • 5.Command(绑定相关)
    • 6.Eevent Aggregator (事件聚合器)
    • 7.Navigation(导航)
    • 8.Dialog(对话框)

    五、创建一个Prism应用程序

    1、安装VS拓展包:Prism Template Pack(已有则不需要安装)。

    2、添加新项目并选择项目模板:Prism Blank App(.NET Core)。

    在这里插入图片描述

    3、项目创建过程中会让你选择一个容器,我们选择了Unity容器,具体使用可以https://blog.csdn.net/zhudaokuan/article/details/111227077。

    在这里插入图片描述

    4、这样一个空白的.NET Core Prism WPF项目就创建成功了。

    在这里插入图片描述

    那么我们来看看它到底有什么不一样的地方。

    5、首先查看App.xaml和App.xaml.cs文件

    <prism:PrismApplication
        x:Class="PrismBlankAppCore.App"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:PrismBlankAppCore"
        xmlns:prism="http://prismlibrary.com/">
        <Application.Resources />
    </prism:PrismApplication>
    
        public partial class App
        {
            protected override Window CreateShell()
            {
                return Container.Resolve<MainWindow>();
            }
    
            protected override void RegisterTypes(IContainerRegistry containerRegistry)
            {
                
            }
        }
    

    在App.xaml文件中,原先的Application类替换为了prism:PrismApplication,但同样的它们都是App的部分类。那PrismApplication和Application有什么关系呢?

    Appliction PrismApplicationBase +IContainerProvider Container +Window CreateShell PrismApplication

    PrismApplictionBase抽象类中有几个重要的属性和方法:

    • IContainerProvider Container只读属性:Unity容器对象,可以用来创建对象。
    • abstract RegisterTypes(IContainerRegistry containerRegistry)抽象方法:可以用来给容器中注册对象。
    • abstract Window CreateShell()抽象方法:用来创建主窗体。

    try containerRegistry)抽象方法:可以用来给容器中注册对象。

    • abstract Window CreateShell()抽象方法:用来创建主窗体。

    所以我们可以看到在App类中,已经重写了CreateShell()方法和RegisterTypes()方法。还有一点值得一提,在App.xaml文件中,我们没有设置StartupUri,这是因为我们重写了CreateShell()方法,并在方法中使用容器创建了主窗体。

    六 Demo

    Demo持续更新中

    展开全文
  • Prism-Samples-Wpf-master06-10的VS2017版本实现,下载手动重新安装一下nuget包即可,方便大家学习
  • WPF-Prism框架在项目中使用

    千次阅读 2020-05-16 16:17:42
    本文大纲 1、Prism框架下载和说明 2、Prism项目预览及简单介绍。 3、Prism框架如何在项目中使用。 Prism框架下载和说明 ... Prism框架是针对WPF和Silverlight的MVVM框架,这个大家应该之前,都有所耳闻,关于该框架的...

    转自:https://www.cnblogs.com/hegezhou_hot/archive/2012/12/21/2828162.html

    本文大纲

    1、Prism框架下载和说明

    2、Prism项目预览及简单介绍。

    3、Prism框架如何在项目中使用。

    Prism框架下载和说明

          Prism框架是针对WPF和Silverlight的MVVM框架,这个大家应该之前,都有所耳闻,关于该框架的具体说明,可以参考如下地址:

          Prism框架下载

          Prism框架通过功能模块化的思想,来讲复杂的业务功能和UI耦合性进行分离,通过模块化,来最大限度的降低耦合性,很适合我们

    进行类似插件话的思想来组织系统功能。并且模块之间,通过发布和订阅事件来完成信息的通信。而且其开放性支持多种框架集成。

    Prism项目预览及简单介绍

           框架下载完毕后,解压后的文件的组织模式如下:

        image

         我们先打开Hello World QuickStart.bat看看

         image

         上面是项目的组织结构,关于该项目内部的代码结构和写法,我们来一一分析和解释。

         A、先看看HelloworldModule的代码和内容。

         Views文件夹中包含了UI视图界面内容。

         image

         其中只是包含了一个Textbox文本控件,其他没有太多的内容。

         接着看看该设计文件对应的后台cs文件中的代码。

         image

         也是没有什么特别的内容。接着我们看看Module中的内容代码:

          image

            上面对于Module中的代码,我们就简单的分析完毕了,当然这个模块没有办法独立的运行,我们肯定要将模块加载到宿主或某个控制的主界面中,把它显示出来即可,下面我们就来看看Prism最关键的部分。

            B、宿主或主界面。

            先看看APP文件

            image

            设计视图中未指定,那么肯定是在cs文件中的某处直接或简介指定。

            image

          果然,这里采用了BootStrapper来完成Run方法,实现应用的启动,我们可以来深挖,看看该文件中都包含什么内容。

          image

          接着,我们来看看Shell中的内容:

          image

         我们在来看看shell里面有没有什么特殊的代码,打开后台cs文件

          image

          并无任何特殊的内容。所以我们可以大概的了解到了Prism的运行机制和流程,那么运行后的效果如下:

          image

           符合预期的目标,下面我们将继续深入的挖掘Prism的强大之处。

     

     

    Prism框架如何在项目中使用

             Prism是一个强大的Mvvm框架,下面我们将重点讲解如何在项目使用Prism提供的基础功能,完成基于MVVM的WPF项目的框架设计和开发,包括应用程序的架构。

              image  

              项目的解决方案结构,项目采用Prism作为UI框架,NHiberia+Unity作为ORM和IOC框架。

             下面我们就来一步步解析项目中的每个部分的细节和最终项目如何把这些细节组织起来的做一个整体结构上的说明。关于其他的分层设计结构我就不多说了,只关注Prism部分的内容。

            1、关于对Prism的基础封装

            image

           为什么不直接使用Prism,我们希望开发人员的学习成本更低,所以,我们队Prism的一些方法进行了封装,更符合开发人员之前熟悉的MVVM模式。

           关于封装的具体内容,我们后续会看到代码。

           2、关于Infrastructure基础设施层定义

           image

           3、具体的模块定义

           image

           4、看看程序应用宿主的定义:

           image

          通过上面,我们介绍了基础的项目和具体的模块和宿主模块的定义,下面我们就来详细的分析下Prism如何加载模块的并且模块间如何通信,如何完成业务功能的完整流程:

          在之前介绍HelloWorld的时候,我们有简单的介绍了Prism的基本流程是宿主会在Bootstrappter中对模块进行装载并初始化,下面我们来看看我们在我给出的例子中的具体过程。

           a、Shell的定义:

           image

           与之前的区别就是在于,我们原来是手写的字符串,这里通过单独的类定义成静态的常量成员,我们能够防止名称出错的可能。同时我们也可以避免因为某处界面上Region符号的变化,因为某处没有修改,而造成不同步,运行出错的情况的发生,更容易统一的管理。具体的基础设施层中关于RegionType的定义如下:

           image

           接着查看Shell的后台cs代码:

         

    复制代码
     1     /// <summary> 
     2     /// MainWindow.xaml 的交互逻辑 
     3     /// </summary> 
     4     [Export] 
     5     public partial class Shell : Window 
     6     { 
     7         public Shell() 
     8         { 
     9             InitializeComponent(); 
    10         }
    11 
    12         /// <summary> 
    13         /// 设置ViewModel 
    14         /// </summary> 
    15         /// <remarks> 
    16         /// This set-only property is annotated with the <see cref="ImportAttribute"/> so it is injected by MEF with 
    17         /// the appropriate view model. 
    18         /// </remarks> 
    19         [Import] 
    20         [SuppressMessage("Microsoft.Design", "CA1044:PropertiesShouldNotBeWriteOnly", Justification = "Needs to be a property to be composed by MEF")] 
    21         ShellViewModel ViewModel 
    22         { 
    23             set 
    24             { 
    25                 this.DataContext = value; 
    26                 if (this.DataContext != null) 
    27                 { 
    28                     ((ShellViewModel)this.DataContext).OnStatusChanged += new Action<string>(SystemStatusManagementEventHandler); 
    29                 } 
    30             } 
    31         }
    32 
    33         public void SystemStatusManagementEventHandler(string parameter) 
    34         { 
    35             if (parameter.IsNullOrEmpty()) 
    36             { 
    37                 throw new ArgumentNullException("无法完成操作"); 
    38             }
    39 
    40             switch (parameter) 
    41             { 
    42                 case HM_EMSTS.WorkStation.Infrastructure.MenuParams.Max: 
    43                     this.WindowState = System.Windows.WindowState.Maximized; 
    44                     break; 
    45                 case HM_EMSTS.WorkStation.Infrastructure.MenuParams.Min: 
    46                     this.WindowState = System.Windows.WindowState.Minimized; 
    47                     break; 
    48                 case HM_EMSTS.WorkStation.Infrastructure.MenuParams.Close: 
    49                     if (MessageBox.Show("是否退出系统?", "退出系统?", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.OK) 
    50                     { 
    51                         this.Close(); 
    52                     } 
    53                     break; 
    54             } 
    55         } 
    56     }
    复制代码

     

          上面的代码中采用了MEF中的Export特性和Import特性。 关于MEF的内容,我这里就不多介绍了,不是很了解的可以谷歌或百度下。

          继续,我们查看Shell的ViewModel定义,因为上面的后台的cs代码中有订阅相关的事件。

     

    复制代码
     1    [Export(typeof(ShellViewModel))] 
     2    public class ShellViewModel : HM_EMSTS.WorkStation.UICommon.NotifyBaseObject 
     3    { 
     4        public Action<string> OnStatusChanged;
     5 
     6        [ImportingConstructor] 
     7        public ShellViewModel(IEventAggregator eventAggregator) 
     8        { 
     9            //注册事件 
    10            if (eventAggregator == null) 
    11            { 
    12                throw new ArgumentNullException("eventAggregator"); 
    13            }
    14 
    15            eventAggregator.GetEvent<HM_EMSTS.WorkStation.Infrastructure.Events.SystemStatusManagementEvent>().Subscribe(this.SystemStatusManagementEventHandler); 
    16        }
    17 
    18        public void SystemStatusManagementEventHandler(string parameter) 
    19        { 
    20            if (parameter.IsNullOrEmpty()) 
    21            { 
    22                throw new ArgumentNullException("无法完成操作"); 
    23            }
    24 
    25            if (OnStatusChanged != null) 
    26                OnStatusChanged(parameter); 
    27        } 
    28    }
    复制代码

     

       上面的代码,主要是为了完成对事件的订阅,并且当收到订阅的事件时,通知出去。这里特别注意,可以参考下图:

       image

          关于Event的定义我们可以看看上述Event的定义:

          image

          如果想按照,我们之前写的那样的形式来绑定和触发事件操作的话,必须这么写。

          那么下面我们来看看ShellModule的定义吧,我们这里的代码如下:

          image

          我们使用了某个Module项目中的页面来替换shell中的Region。这样保证了Shell运行起来后能够正确的显示界面。

          下面来看看项目中最重要的WorkStationBootstrapper的定义

           image

            前面介绍的helloWorld里面是采用的Unity容器,这里是MEF,所以要注意的部分,有所不同。这里需要制定MEF可导入导出部件所在的目录或程序集

            image

            我们知道shell后台cs的代码定义前面也说过了,有带有export标记。那么当执行上述的代码后,将会出现在MEFbootstrappter的Container中。这里的container是CompositionContainer是MEF中定义的。

            接着查看如下方法:

            image

            通过上面的几个方法,此时,我们的主程序,就完成了对Region的解析,显示出来即可。

            B、模块定义:

            image

            Module主要是为了,替换Region符合和标记为具体的界面而是用的。

            我们下面挑选一个页面来展示完整的定义和操作。

            1、Model定义:

            image

            当我们的Model具有自动通知机制时,特别对于列表中的某个单元格的属性发生改变后,不需要刷新整个列表,这时候就会自动完成更新,WPF会自动完成。

           2、IView接口定义。

           image

           因为我们这里采用MVP的设计模式,所以要求所有的View必须继承自IView接口。

           image

          我们这里都是直接定义View对应的唯一接口即可,主要是为了MEF的Export和Import时有用。

          3、View的定义。

          设计视图:

          image

          后台代码:

          image

         4、ViewModel的定义。

         这里由于我们采用MVP模式,所有对于不同View之间的交互,我们这里放到了Presenter中,ViewModel充当的是对IView界面的完全控制抽象。

           image

           所以我们看到这里,没有任何的业务代码。但是对已IView界面所有的绑定信息,都需要定义到该类中。

          5、Presenter定义。

          image

          上面讲Presenter标记了Export。主要是在Module中对Region进行映射时使用。

          然后我们来看看PresenterBase的定义,一看便明白

          image

          这样在构造展示器时,我们便可以将IView和ViewModel之间的关系完成绑定。

          6、Module的定义

           image

          这样我们就完成了,一个模块的功能开发,该功能模块尽量功能独立。

          最终,我们通过一个主界面,将这样功能模块组装起来即可。

    最终

          将上面构建的模块运行下,看看效果,也许效果不是很好看,没有设置样式。

           image

        程序运行的框架还是非常的清晰,上面是工具栏,菜单栏,内容区。通过Prism我们可以讲菜单栏或者工具栏中的功能都设计成独立的模块,分别进行装载和控制,这样能够具有非常好的扩展性和可维护性。

    展开全文
  • WPF Prism构建模块式开发框架

    千次阅读 2019-03-11 09:26:36
    WPF PrismPrism框架扩展安装资源项目Prism主项目模块项目 Prism框架扩展安装 Prism已经更新到7.x。打开VS2017,在扩展和更新里面安装Prism模板。 新建3个项目,1个主项目,1个模块项目,最后1个资源项目(提供界面...

    Prism框架扩展安装

    Prism已经更新到7.x。打开VS2017,在扩展和更新里面安装Prism模板。
    在这里插入图片描述
    新建3个项目,1个主项目,1个模块项目,最后1个资源项目(提供界面样式)。项目之间通过prism自带的ioc注入,达到解耦,项目之间不需要互相引用。
    在这里插入图片描述

    资源项目

    添加“资源字典" DefaultStyle.xaml文件,代码如下:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                        xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
                        xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors">
        <Style x:Key="Button" TargetType="dx:SimpleButton">
            <Setter Property="Foreground" Value="AliceBlue"/>
            <Setter Property="Width" Value="70"/>
            <Setter Property="Height" Value="50"/>
        </Style>
    </ResourceDictionary>
    

    Prism主项目

    打开App.xaml.cs文件修改如下:

    using DevExpress.Xpf.Core;
    using Prism.Ioc;
    using Prism.Modularity;
    using Prism.Unity;
    using System.Windows;
    using TEST500ServiceMonitor.Views;
    
    namespace TEST500ServiceMonitor
    {
        /// <summary>
        /// Interaction logic for App.xaml
        /// </summary>
        public partial class App : PrismApplication
        {
            public App()
            {
            //使用主题(devexpress),
                ApplicationThemeHelper.ApplicationThemeName = Theme.Office2016ColorfulName;
                ApplicationThemeHelper.UseLegacyDefaultTheme = false;
                //启动splash
                DXSplashScreen.Show<SplashView>();
            }
    
            protected override Window CreateShell()
            {
                return Container.Resolve<MainWindow>();
            }
    
            protected override void RegisterTypes(IContainerRegistry containerRegistry)
            {
    
            }
    
            protected override IModuleCatalog CreateModuleCatalog()
            {
            //定义模块加载位置,相对路径(此类方式加载速度稍慢但方便,也可使用指定方式加载,此处不做详细解释,可查看官方文档或样例)
                return new DirectoryModuleCatalog() { ModulePath = @".\Modules" };
            }
        }
    }
    
    

    App.xaml文件中使用资源字典项目(需要先编译下,再引用,否则找不到路径),代码如下:

    <prism:PrismApplication x:Class="TEST500ServiceMonitor.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    	         xmlns:prism="http://prismlibrary.com/"
                 xmlns:local="clr-namespace:TEST500ServiceMonitor">
        <Application.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="/TEST500ServiceStyle;component/DefaultStyle.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Application.Resources>
    </prism:PrismApplication>
    
    

    MainWindow.xaml.cs文件修改如下:

    using DevExpress.Xpf.Core;
    using System.Windows;
    
    namespace TEST500ServiceMonitor.Views
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : ThemedWindow
        {
            public MainWindow()
            {
                InitializeComponent();
                Loaded += OnLoaded;
                for (int i = 0; i <= 100; i++)
                {
                    DXSplashScreen.Progress(i);
                    DXSplashScreen.SetState(string.Format("{0} %", i));
                    System.Threading.Thread.Sleep(40);
                }
            }
    
            void OnLoaded(object sender, RoutedEventArgs e)
            {
                DXSplashScreen.Close();
            }
        }
    }
    
    

    MainWindow.xaml文件,修改如下:

    <dxc:ThemedWindow
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:prism="http://prismlibrary.com/"
            xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
            xmlns:dxc="http://schemas.devexpress.com/winfx/2008/xaml/core"
            xmlns:TEST500ServiceMonitor="clr-namespace:TEST500ServiceMonitor"
            x:Class="TEST500ServiceMonitor.Views.MainWindow"
            prism:ViewModelLocator.AutoWireViewModel="True"
            Title="{Binding Title}" WindowStartupLocation="CenterScreen" Height="400" Width="600" ResizeMode="NoResize">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="100"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="260"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Image Source="pack://application:,,,/TEST500ServiceMonitor;component/Images/TEST500Logo.png" Margin="10 10 10 10"/>
            <StackPanel Orientation="Horizontal" Grid.Column="1" Grid.Row="0">
                <dxc:SimpleButton Command="{Binding StopServiceCommand}" CommandParameter="ViewA" Margin="5" Content="{Binding Message}" Style="{StaticResource Button}"/>
                <dxc:SimpleButton Command="{Binding NavigateCommand}" CommandParameter="ViewA" Margin="5" Content="在线用户" Style="{StaticResource Button}"/>
                <dxc:SimpleButton Command="{Binding NavigateCommand}" CommandParameter="Test500History" Margin="5" Content="历史记录" Style="{StaticResource Button}"/>
                <dxc:SimpleButton Command="{Binding ExitCommand}" CommandParameter="ViewA" Margin="5" Content="退出程序" Style="{StaticResource Button}"/>
            </StackPanel>
            <dxc:LoadingDecorator Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1" BorderEffect="Default" BorderEffectColor="Blue" UseFadeEffect="True">
                <ContentControl prism:RegionManager.RegionName="ContentRegion" Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2" />
            </dxc:LoadingDecorator>
        </Grid>
    </dxc:ThemedWindow>
    

    MainWindowViewModel文件,修改如下:

    using DevExpress.Xpf.Core;
    using DevExpress.Xpf.WindowsUI;
    using Prism.Commands;
    using Prism.Mvvm;
    using Prism.Regions;
    using System.Windows;
    using System.Windows.Input;
    
    namespace TEST500ServiceMonitor.ViewModels
    {
        public class MainWindowViewModel : BindableBase
        {
            private readonly IRegionManager _regionManager;
    
            public MainWindowViewModel(IRegionManager regionManager)
            {
                _regionManager = regionManager;
    
                NavigateCommand = new DelegateCommand<string>(Navigate);
                StopServiceCommand = new DelegateCommand<string>(StopService);
                ExitCommand = new DelegateCommand<string>(Exit);
            }
            
            private string _title = "TEST500监控中心";
            public string Title
            {
                get { return _title; }
                set { SetProperty(ref _title, value); }
            }
    
            private string _message = "停止服务";
            public string Message
            {
                get { return _message; }
                set { SetProperty(ref _message, value); }
            }
    
            public DelegateCommand<string> NavigateCommand { get; private set; }
            public DelegateCommand<string> StopServiceCommand { get; private set; }
    
            /// <summary>
            /// 关闭程序
            /// </summary>
            public DelegateCommand<string> ExitCommand { get; private set; }
    
            private void Navigate(string navigatePath)
            {
                if (navigatePath != null)
                {
    
                    _regionManager.RequestNavigate("ContentRegion", navigatePath);
                }
            }
    
            private void StopService(string s)
            {
                var msg = "";
                if (Message == "启动服务")
                    msg = "停止服务";
                else
                    msg = "启动服务";
                if (WinUIMessageBox.Show($"确认要{Message}吗?", "提示", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
                {
                    Message = msg;
                }
            }
    
            private void Exit(string win)
            {
                if (WinUIMessageBox.Show("确认要关闭窗口吗?", "提示", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
                {
                    Application.Current.Shutdown();
                }
            }
        }
    }
    
    

    模块项目

    模块项目中的界面都是创建再UserControl中,只需要再module中注册界面加载方式即可

    using Prism.Ioc;
    using Prism.Modularity;
    using Prism.Regions;
    using TEST500ServiceModule.Views;
    
    namespace TEST500ServiceModule
    {
        public class TEST500ServiceModuleModule : IModule
        {
            public void OnInitialized(IContainerProvider containerProvider)
            {
                var regionManager = containerProvider.Resolve<IRegionManager>();
                regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA));//默认该模块中的默认起始页
            }
    
            public void RegisterTypes(IContainerRegistry containerRegistry)
            {
                containerRegistry.RegisterForNavigation<Test500History>();//模块中的其他页
            }
        }
    }
    
    展开全文
  • WPF、MVVM和Prism学习历程

    千次阅读 2017-11-30 16:00:12
    面对从天而降的两个专有名词,今日我开始了漫漫Mvvm和Prism的学习之路。 之前一直在做WinForm的开发,本身WPF就接触的不多,更别提Siverlight了。 好了说正题。 ...主要要学习的核心内容包括
  • 开发环境:VS2015 + .NET 4.6.2 开发项目1:WPF + CefSharp 开发项目2:WPF 情况:两个项目编译的程序都无法在客户环境的 win7上运行,事件查看器中如下日志: 1 The process was terminated due to an ...
  • Prism入门系列教程-第1天创建WPF示例

    千次阅读 2018-03-08 02:24:46
    打开VS,选择新建项目,选择Visual C#-&gt;新建项目-&gt;...创建成功后,选择VS菜单项,工具-&gt;NuGet包管理器-&gt;管理解决方案的NuGet程序包选择Prism.Unity和Prism.Wpf,并选择刚才新建的...
  • wpf datagrid 行双击事件

    2015-08-06 14:45:00
    Xaml: <DataGrid ItemsSource="{Binding SessionList}" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" ...
  • 2014四月 Prism以示例和文档的形式帮助你更简单的设计丰富灵活易维护的WPF程序。其中使用的设计模式体现了一些重要的设计原则,例如分离关注点和松耦合,Prism帮助你利用松耦合组件设计和构建应用程序。...
  • WPF与Prism一并学习 一

    2018-11-09 02:16:22
    WPF与Prism一并学习 一
  • 使用Prism实现的WPF MVVM点餐Demo

    千次阅读 2013-02-09 16:34:46
    1.新建一个WpfPrism的WPF项目,添加Prism dll引用,(使用NotificationObject、DelegateCommand)如下: 2.在项目中添加一个Data文件夹,放入Data.XML文件,文件如下: View Code " 1.0 " ...
  • 1.新建一个WpfPrism的WPF项目,添加Prism dll引用,(使用NotificationObject、DelegateCommand)如下:  2.在项目中添加一个Data文件夹,放入Data.XML文件,文件如下: View Code " 1.0 " encoding= " ...
  • PrismDIFullApp.zip

    2021-09-15 09:51:36
    WPF在使用PRISM框架时,如何使用微软中的依赖注入框架呢?本代码通过实现AutoMapper的依赖注入功能进行实现,如果需要其他类库的依赖注入功能,均可以通过此原来进行扩展
  • WPF Prism博客链接

    2014-04-21 14:17:27
    http://www.cnblogs.com/Jax/category/213017.html
  • Prism8.0 框架入门

    2021-06-21 19:44:42
    Prism8.0Prism简介Prism.CoreMVVMBindableBaseCommandEventAggregatorModuleRegionContainerPrism.WpfPrism.DryIoc.WpfPrism.Unity.WpfPrism与其他框架区别源码路径 Prism简介 Prism 是一个用于在 WPF、Xamarin ...
  • The Prism for WPF guide contains the following topics: Prism指南包含以下内容: Download and Setup Prism...What's New in Prism Library 5.0 for WPFPrism5.0新内容 Introduction介绍 Initializing Ap...

空空如也

空空如也

1 2
收藏数 22
精华内容 8
热门标签
关键字:

wpfprism