WPF Prism框架搭建

news2024/11/24 4:09:38

WPF Prism框架搭建

1.引入Prism框架

在Nuget包管理器中搜索Prism,并添加到项目中

在这里插入图片描述

2.在项目中使用prism框架

2.1 修改app.xaml

  • 删除项目中自带的StartupUri

    在这里插入图片描述

  • 修改Application节点为prism:PrismApplication

  • 引入prism命名空间

    在这里插入图片描述

<prism:PrismApplication x:Class="WpfPrismSimple.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfPrismSimple"
             xmlns:prism="http://prismlibrary.com/">
    <Application.Resources>
        <ResourceDictionary>
            
            <!--  全局样式  -->
            ...

            <ResourceDictionary.MergedDictionaries>
                <!--  样式模板  -->
                ...
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</prism:PrismApplication>

2.2 修改app.xaml.cs

  • 将原继承的Application替换成PrismApplication
  • 实现PrismApplication的抽象方法
    • CreateShell
    • RegisterTypes
  • 使用容器构建界面显示
public partial class App : PrismApplication
{
    protected override Window CreateShell()
    {
        return Container.Resolve<MainWindow>();
    }

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        
    }
}

3.实现Mvvm

3.1 View和ViewModel自动关联

  • View文件必须放在Views文件夹下,ViewModel文件必须放在ViewModels文件夹下

  • ViewModel命名必须是View文件名称+ViewModel结尾

  • View文件的xaml中需要增加自动关联属性

    xmlns:prism="http://prismlibrary.com/"
    xmlns:prism="http://prismlibrary.com/"
    prism:ViewModelLocator.AutoWireViewModel="True"
    

    在这里插入图片描述

3.2 View和ViewModel手动关联

  • 通过手动在App类中的RegisterTypes方法中关联View和ViewModel
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    #region 路由管理
    //通过RegisterForNavigation进行手动关联
    containerRegistry.RegisterForNavigation<MainWindow, MainWindowViewModel>();
    #endregion
}

4.属性绑定

  1. 在ViewModel中继承Prism.Mvvm.BindableBase类,并定义一个InputText属性,用于绑定TextBox的Text属性。代码示例如下:
public class MainWindowViewModel : BindableBase
{
    private string _InputText;
    public string InputText
    {
        get { return _InputText; }
        set { SetProperty(ref _InputText, value); }
    }
}
  1. 在XAML中,将TextBox的Text属性绑定到ViewModel的InputText属性
<TextBox Text="{Binding SearchText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
</TextBox>

5.方法绑定

5.1使用 Command

在Button、RadioButton等有Command属性的控件使用命令,将点击事件发送到ViewModel中

<Button
       Width="200"
       Height="40"
       Command="{Binding TextClickCommand}"
       Content="test click" />
/// <summary>
/// 无参命令
/// </summary>
public ICommand TestClickCommand { get; set; }

public MainWindowViewModel()
{
     TestClickCommand = new DelegateCommand(TestClickExecuted);    
}

private void TestClickExecuted()
{
    Console.WriteLine("TestClickExecuted");
}

5.2使用 Triggers

​ 1. 首先,在ViewModel中添加一个命令(Command)来处理TextChanged事件。定义一个实现ICommand接口的属性,并在构造函数中将其初始化为一个DelegateCommand或其他实现ICommand接口的类。

public class MainViewModel
{
    public ICommand TextChangedCommand { get; set; }

    public MainViewModel()
    {
        TextChangedCommand =  new DelegateCommand<string>(TextChangedExecuted);
    }
    
    private void TextChangedExecuted(string text)
    {
        // 处理TextChanged事件的逻辑
    }
}

​ 2. 在XAML中,将TextBox的TextChanged事件绑定到ViewModel中定义的TextChangeCommand,并使用EventTrigger将事件触发绑定到Command,然后将TextBox的TextChanged事件绑定到ViewModel中的Command:

<TextBox Text="{Binding InputText}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="TextChanged">
            <i:InvokeCommandAction 
                Command="{Binding TextChangedCommand}" 
                CommandParameter="{Binding Text, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TextBox}}}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>

</TextBox>

  1. 获取在ListBox使用SelectionChanged将选中项事件绑定到ViewModel:
    <!--  数据列表  -->
    <ListBox
        x:Name="listBox"  
        ItemContainerStyle="{StaticResource NormalListBoxItem}"
        ItemTemplate="{StaticResource OSDDataItemTemplate}"
        ItemsSource="{Binding ModelList}"
        SelectedIndex="{Binding SelectOsdIndex}"
        SelectionChanged="DataList_SelectionChanged">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <i:InvokeCommandAction Command="{Binding SelectChangedCommand}" CommandParameter="{Binding ElementName=listBox, Path=SelectedItem}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </ListBox>

6.事件聚合器 Event Aggregator

在Prism框架中,可以使用事件聚合器(Event Aggregator)来实现多个ViewModel之间的松散耦合通信。事件聚合器允许ViewModel之间通过发布和订阅事件来进行通信,而不需要直接引用彼此,从而减少它们之间的依赖性。

以下是在Prism框架中使用事件聚合器的步骤:

  1. 首先,在App.xaml.cs文件中初始化事件聚合器:
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterSingleton<IEventAggregator, EventAggregator>();
}
  1. 在需要进行通信的ViewModel中,注入IEventAggregator接口,并定义一个事件类:
public class UpdateEvent : PubSubEvent<string>
{
}

public class FirstViewModel : BindableBase
{
    private readonly IEventAggregator _eventAggregator;

    public FirstViewModel(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        // 订阅事件
        _eventAggregator.GetEvent<UpdateEvent>().Subscribe(UpdateMethod);
    }

    private void UpdateMethod(string message)
    {
        // 处理事件
    }
}
  1. 在另一个ViewModel中,也注入IEventAggregator接口,并订阅事件:
public class SecondViewModel : BindableBase
{
    private readonly IEventAggregator _eventAggregator;

    public SecondViewModel(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;

        // 发布事件
        _eventAggregator.GetEvent<UpdateEvent>().Publish("Message from SecondViewModel");
    }
}

通过上述步骤,FirstViewModelSecondViewModel之间可以通过事件聚合器进行松散耦合的通信。当SecondViewModel发布UpdateEvent事件时,FirstViewModel中的UpdateMethod方法会被调用,并传递消息作为参数。

这种方式可以帮助在Prism框架中实现多个ViewModel之间的通信,使它们之间更加解耦合

7.区域 Region

在Prism框架中,区域(Region)是一种特殊的控件,用于动态加载和管理视图的容器。通过使用区域,可以实现灵活的模块化设计和动态的视图切换。以下是一个简单的示例代码,演示如何在Prism框架中使用区域:

  1. 首先,定义一个区域控件(如ContentControl)来表示区域,在XAML文件中:
<ContentControl Name="MainRegion" prism:RegionManager.RegionName="MainRegion" />

在这个示例中,我们创建了一个名为MainRegion的区域,通过prism:RegionManager.RegionName属性来标识它。

  1. 然后,在ViewModel或者Module中,使用IRegionManager接口来导航到该区域并加载视图:
public class MainViewModel : BindableBase
{
    private readonly IRegionManager _regionManager;

    public MyModule(IRegionManager regionManager)
    {
        _regionManager = regionManager;
    }

    public void Initialize()
    {
        _regionManager.RegisterViewWithRegion("MainRegion", typeof(MyView));
    }
}

在这个示例中,我们在Initialize方法中通过_regionManager.RegisterViewWithRegion方法将MyView视图注册到名为MainRegion的区域中。

  1. 最后,创建并定义MyView视图(UserControl),并对其进行需要的创建、展示和绑定等操作。

通过以上步骤,区域管理器(RegionManager)会自动加载MyView视图到MainRegion的区域中。通过Prism框架的区域机制,我们可以实现模块化设计,将应用程序拆分成多个模块,每个模块负责自己的视图和逻辑,并通过区域进行展示和管理。

希望这个简单示例对你有帮助,如果有任何问题或需要进一步的说明,请随时告诉我。

8.对话框 DialogService

在Prism框架中,DialogService是一个用于显示对话框的服务,它提供了一种方便的方式让ViewModel调用对话框而不依赖于具体的UI组件。以下是一个简单的示例代码,演示如何在Prism框架中使用DialogService来显示对话框:

  1. 首先,在App.xaml.cs中注册DialogService服务:
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterDialog<ConfirmationDialog, ConfirmationDialogViewModel>();
}

这里我们注册了一个名为ConfirmationDialog的对话框和相应的ViewModelConfirmationDialogViewModel

  1. 在需要显示对话框的ViewModel中,注入IDialogService服务,并调用ShowDialog方法:
public class MyViewModel : BindableBase
{
    private readonly IDialogService _dialogService;

    public MyViewModel(IDialogService dialogService)
    {
        _dialogService = dialogService;
    }

    public void ShowConfirmationDialog()
    {
        var result = _dialogService.ShowDialog("ConfirmationDialog", new DialogParameters(), null);
        if (result.Result == ButtonResult.OK)
        {
            // 用户点击了确定按钮
        }
    }
}

在上述示例中,当需要显示对话框时,调用ShowDialog方法并传递对话框的名称(“ConfirmationDialog”)、参数(DialogParameters对象)和回调方法。最后根据用户操作的结果进行相应的处理。

  1. 创建对应的对话框视图和ViewModel:

对话框视图(如ConfirmationDialog.xaml)和ViewModel(如ConfirmationDialogViewModel.cs)。在对话框的ViewModel中实现对话框逻辑,并在需要的时候通过IDialogAware接口返回用户操作的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1817657.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年中国移动游戏市场研究报告

来源&#xff1a;点点数据&#xff1a; 近期历史回顾&#xff1a; 面向水泥行业的5G虚拟专网技术要求&#xff08;2024&#xff09;.pdf 2024年F5G-A绿色万兆全光园区白皮书.pdf 2024年全球废物管理展望报告.pdf 内容管理系统 2024-2025中国羊奶粉市场消费趋势洞察报告.pdf 20…

MySQL 示例数据库大全

前言&#xff1a; 我们练习 SQL 时&#xff0c;总会自己创造一些测试数据或者网上找些案例来学习&#xff0c;其实 MySQL 官方提供了好几个示例数据库&#xff0c;在 MySQL 的学习、开发和实践中具有非常重要的作用&#xff0c;能够帮助初学者更好地理解和应用 MySQL 的各种功…

糖尿病患者血糖控制困难,4个辅助降糖方法分享。

对于糖尿病患者来讲&#xff0c;血糖控制极为困难&#xff0c;稍不留意就会致使忽高忽低的情况出现&#xff0c;今天我来教你 4 个办法来辅助降糖。 第一&#xff0c;在饮食上可多进食全谷类食物&#xff0c;中医认为谷类食物是脾胃的主食。经常吃这类食物不但能够给脾胃提供充…

DSSA(Domain-Specific Software Architecture)方法论

DSSA&#xff08;Domain-Specific Software Architecture&#xff09;方法论是一种针对特定问题领域的软件架构设计方法。在软件开发中&#xff0c;有些问题在特定领域是共通的&#xff0c;这些问题可以通过通用的抽象和解决方案来处理。DSSA方法论正是利用这一特点&#xff0c…

比 Safari 阅读模式更强大的阅读助手

一、简介 1、一款专为浏览器设计的扩展程序&#xff0c;旨在提供更为简洁、高效的网页阅读体验。它能够对网页内容进行智能提取和排版&#xff0c;自动屏蔽广告和噪音&#xff0c;使读者能够专注于网页的核心内容。此外&#xff0c;Circle 阅读助手还具备多种个性化功能&#x…

Mongodb在UPDATE操作中使用$pull操作

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第68篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

c++实战知识点

c实战知识点 一、概述1.数据2.C11的原始字面量3.数据类型的别名4.const修饰指针5.void关键字6.内存模型7.二级指针8.函数指针和回调函数9.数组10.C风格字符串11.二维数组用于函数的参数行指针&#xff08;数组指针&#xff09; 12.引用引用与const 13.各种形参的使用场景14.重载…

数据结构01 栈及其相关问题讲解

栈是一种线性数据结构&#xff0c;栈的特征是数据的插入和删除只能通过一端来实现&#xff0c;这一端称为“栈顶”&#xff0c;相应的另一端称为“栈底”。 栈及其特点 用一个简单的例子来说&#xff0c;栈就像一个放乒乓球的圆筒&#xff0c;底部是封住的&#xff0c;如果你想…

Druid 参数配置详解

简介 Java 程序很大一部分要操作数据库&#xff0c;为了提高性能操作数据库的时候&#xff0c;又不得不使用数据库连接池。 Druid 是阿里巴巴开源平台上一个数据库连接池实现&#xff0c;结合了 C3P0、DBCP 等 DB 池的优点&#xff0c;同时加入了日志监控。 Druid 可以很好的…

基础-01-计算机网络概论

一. 计算机网络的发展与分类 1.计算机网络的形成与发展 计算机网络&#xff1a;计算机技术与通信技术的结合 ICTITCT 2.计算机网络标准阶段 3.计算机网络分类1:通信子网和资源子网 通信子网:通信节点(集线器、交换机、路由器等)和通信链路(电话线、同轴电缆、无线电线路、卫…

HashMap第3讲——JDK1.8红黑树细节

上篇文章对HashMap的put方法进行了源码解析&#xff0c;并介绍了其中的两个亮点设计——位运算取代%和扰动计算。其中还有几个细节&#xff0c;比如每次扩容都是2^n是怎么做到的、JDK1.8增加的红黑树结构&#xff0c;由于篇幅原因没有介绍&#xff0c;本节就先来介绍其中的一个…

网络安全 - ARP 欺骗原理+实验

APR 欺骗 什么是 APR 为什么要用 APR A P R \color{cyan}{APR} APR&#xff08;Address Resolution Protocol&#xff09;即地址解析协议&#xff0c;负责将某个 IP 地址解析成对应的 MAC 地址。 在网络通信过程中会使用到这两种地址&#xff0c;逻辑 IP 地址和物理 MAC 地址&…

Stable Diffusion 3 即将开源 引AI界巨大震动;马斯克考虑打造X Phone并威胁禁用苹果设备

&#x1f989; AI新闻 &#x1f680; Stable Diffusion 3 即将开源 引AI界巨大震动 摘要&#xff1a;Stable Diffusion 3有望在明天开源&#xff0c;带来革命性的AI生成图像技术。该版本采用MMDiT全新架构&#xff0c;可能彻底改变AI图像生成格局。尽管Stability AI公司面临财…

国产化替代及现有程序优化

数据库优化 月中、月末程序用的多 数据库慢查询sql 较多&#xff0c;增加数据库服务器内存 现在16G通过内存数据库&#xff0c;中间件缓解数据库压力&#xff0c;热点数据通过内存数据存储客户端不直接连 数据库Sql语句 优化 避免过多join数据库读写分离&#xff0c;甚至分布…

《软件定义安全》之八:软件定义安全案例

第8章 软件定义安全案例 1.国外案例 1.1 Fortinet&#xff1a;传统安全公司的软件定义方案 Fortinet的软件定义安全架构强调与数据中心的结合&#xff0c;旨在将安全转型为软件定义的模式&#xff0c;使安全运维能够与数据中心的其他部分一样灵活、弹性。在Fortinet看来&…

cdh zookeeper报错 Canary 测试建立与 ZooKeeper 服务的连接或者客户端会话失败。

我一直纳闷这个是什么问题&#xff0c;搜索了半天没有结果&#xff0c;因为别人没有遇到过。后面我重新搭建了另一套cdh&#xff0c;然后看了一下默认的配置&#xff0c;然后更新上去才发现的。 这里面的clientPortAddress不要手动设置端口号。 别勾选通信验证 不要开启TLS/SS…

政安晨【零基础玩转各类开源AI项目】解析开源:gradio:在Python中构建机器学习Web应用

目录 下载项目 快速开始 Gradio能做什么&#xff1f; Hello, World Interface 类 组件属性 多输入和输出组件 一个图像示例 Blocks: 更加灵活且可控 你好, Blocks 更多复杂性 尝试 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏…

学习笔记——网络管理与运维——概述(背景)

一、背景 1、计算机时代的演进 1964年IBM公司花费50亿美金开发出了IBM SYSTEM/360大型机&#xff0c;开始了大型机的历史。大型机通常采用集中式体系架构&#xff0c;这种架构的优势之一是其出色的I/O处理能力&#xff0c;因而最适合处理大规模事务数据。与PC生态系统比较&…

Java 截压缩包(zip包),解析xml文件-工具类

Java 截压缩包&#xff08;zip包&#xff09;&#xff0c;解析xml文件-工具类 技术&#xff1a;在Java中&#xff0c;使用Java自带的java.util.zip.ZipFile包 代码示例如下&#xff1a; 注1&#xff1a;在下面的代码中&#xff0c;zipFilePath替换为要解压缩的.zip文件的实际…

编译原理-程序设计语言的设计

机器语言:二进制、机器相关 汇编语言:助记符、机器相关(机器语言与汇编语言都是低级语言) 高级语言:接近自然语言、机器无关 把一种语言程序编写的转换成完全等效的另一种语言编写的程序为翻译。 编译程序: 源程序语言是高级语言,目标程序语言是汇编语言或机器语言之类…