当前位置: 首页 > article >正文

WPF中Prism框架的简单使用

1.创建Prism框架下的WPF项目

 

 2.创建Login.XAML文件并将自动匹配写入Login.XAML中  然后再ViewModels文件夹中创建对应的文件

自动匹配导入

3.在App.XAML.cs中写下如下代码 只有登录窗体登录成功以后才会打开MainWindow.XAML窗体

using Prism.Ioc;
using System.Windows;
using WPF练习16Prism框架的简单使用.Views;

namespace WPF练习16Prism框架的简单使用
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App
    {
        protected override Window CreateShell()
        {

            return Container.Resolve<MainWindow>();
        }

        protected override void InitializeShell(Window shell)
        {
            base.InitializeShell(shell);
            var loginWin = Container.Resolve<Login>(); // 拿到登录窗体
            if (loginWin.ShowDialog() == false)
            {
                Current.Shutdown();
            }
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {

        }
    }
}

4.写Login.XAML代码和LoginViewModel代码

Login.XAML如下:

<Window x:Class="WPF练习16Prism框架的简单使用.Views.Login"
        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:WPF练习16Prism框架的简单使用.Views"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        mc:Ignorable="d"
        Title="Login" Height="450" Width="800">
    <Grid HorizontalAlignment="Center"
          VerticalAlignment="Center">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <StackPanel Margin="0,0,0,10">
            <WrapPanel>
                <Label Content="账号:" />
                <TextBox Width="150" />
            </WrapPanel>
        </StackPanel>
        <StackPanel Grid.Row="1"
                    Margin="0,0,0,10">
            <WrapPanel>
                <Label Content="密码:" />
                <TextBox Width="150" />
            </WrapPanel>
        </StackPanel>
        <Button Grid.Row="2"
                Width="100"
                Height="30"
                Command="{Binding LoginCommand}"
                CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=Window}}"
                Content="登录" />
    </Grid>
</Window>

LoginViewModel如下:

using Prism.Commands;
using Prism.Ioc;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WPF练习16Prism框架的简单使用.Views;

namespace WPF练习16Prism框架的简单使用.ViewModels
{
    public class LoginViewModel:BindableBase
    {
       

        //IContainerExtension容器扩展的接口
        //把ioc容器注入到当前的VM。
     

        public DelegateCommand<object> LoginCommand
        {
            get
            {
                return new DelegateCommand<object>((obj) =>
                {
                    Login login = obj as Login;
                    login.DialogResult = true;

                    /* Login login = container.Resolve<Login>(); // 只是拿到Login窗体,但Login窗体没有ShowDialog()
                     login.DialogResult = true;*/
                });
            }
        }
    }
}

5.创建其他的UserControl 并学好MainWindow.XAML和MainWindowViewModel.cs

MainWindow.XAML如下:

<Window x:Class="WPF练习16Prism框架的简单使用.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Title="{Binding Title}"
        Height="350"
        Width="525">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Loaded">
            <i:InvokeCommandAction Command="{Binding LoadedCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="60" />
            <RowDefinition />
        </Grid.RowDefinitions>

        <ContentControl Name="Header"
                        prism:RegionManager.RegionName="HeaderRegion" />

        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="160" />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>

            <!--  在xaml文件中使用声明式的语法给区域命名  -->
            <ContentControl prism:RegionManager.RegionName="MenuRegion" />
            <ContentControl Grid.Column="1"
                            prism:RegionManager.RegionName="ContentRegion" />
        </Grid>
    </Grid>
</Window>

MainWindowViewModel如下:

using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using WPF练习16Prism框架的简单使用.Views.Regions;

namespace WPF练习16Prism框架的简单使用.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        private readonly IRegionManager regionManager;
        private string _title = "MainWindow";
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        public MainWindowViewModel(IRegionManager regionManager)
        {
            this.regionManager = regionManager;
        }

        public DelegateCommand LoadedCommand
        {
            get
            {
                return new DelegateCommand(() =>
                {
                    // 导航(跳转)到某个视图
                    //this.regionManager.Regions["HeaderRegion"].RequestNavigate("Header");
                    //this.regionManager.Regions["MenuRegion"].RequestNavigate("Menu");

                    // 发现某个视图View Discovery
                    regionManager.RegisterViewWithRegion<Header>("HeaderRegion");
                    regionManager.RegisterViewWithRegion("MenuRegion", typeof(Menu));
                });
            }
        }
    }
}

创建相应的容器UserControl

Header如下:
<UserControl x:Class="WPF练习16Prism框架的简单使用.Views.Regions.Header"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:WPF练习16Prism框架的简单使用.Views.Regions"
             mc:Ignorable="d"
             d:DesignHeight="450"
             d:DesignWidth="800">
    <Grid>
        <TextBlock Text="header" FontSize="20" />
    </Grid>
</UserControl>
 HeaderViewModel 如下:
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WPF练习16Prism框架的简单使用.ViewModels.Regions
{
    public class HeaderViewModel : BindableBase
    {

    }
}

Menu如下:
<UserControl x:Class="WPF练习16Prism框架的简单使用.Views.Regions.Menu"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:WPF练习16Prism框架的简单使用.Views.Regions"
             mc:Ignorable="d"
             d:DesignHeight="450"
             d:DesignWidth="800">
    <Grid>
        <StackPanel>
            <Button Width="100"
                    Height="30"
                    Margin="0,10"
                    Command="{Binding ToggleCommand}"
                    CommandParameter="{Binding RelativeSource={RelativeSource Self}}"
                    Content="用户管理" />
            <Button Width="100"
                    Height="30"
                    Margin="0,10"
                    Command="{Binding ToggleCommand}"
                    CommandParameter="{Binding RelativeSource={RelativeSource Self}}"
                    Content="产品管理" />
        </StackPanel>
    </Grid>
</UserControl>
MenuViewModel 如下:
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;

namespace WPF练习16Prism框架的简单使用.ViewModels.Regions
{
    public class MenuViewModel : BindableBase
    {
        private readonly IRegionManager regionManager;

        public MenuViewModel(IRegionManager regionManager)
        {
            this.regionManager = regionManager;
        }

        public DelegateCommand<object> ToggleCommand
        {
            get
            {

                return new DelegateCommand<object>((obj) =>
                {

                    Button btn = obj as Button;
                    string content = btn.Content.ToString();
                    if (content == "用户管理")
                    {
                        regionManager.Regions["ContentRegion"].RequestNavigate("User");
                    }
                    else if (content == "产品管理")
                    {
                        regionManager.Regions["ContentRegion"].RequestNavigate("Product");
                    }
                });
            }
        }
    }
}

创建相应的跳转页面:

User如下:

<UserControl x:Class="WPF练习16Prism框架的简单使用.Views.Pages.User"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WPF练习16Prism框架的简单使用.Views.Pages"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <TextBlock Text="用户页面" />
    </Grid>
</UserControl>

UserViewModel 如下:

using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WPF练习16Prism框架的简单使用.ViewModels.Pages
{
    public class UserViewModel : BindableBase
    {
    }
}

Product如下:

<UserControl x:Class="WPF练习16Prism框架的简单使用.Views.Pages.Product"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WPF练习16Prism框架的简单使用.Views.Pages"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <TextBlock Text="商品页面" />
    </Grid>
</UserControl>

ProductViewModel如下: 

using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WPF练习16Prism框架的简单使用.ViewModels.Pages
{
    public class ProductViewModel: BindableBase
    {

    }
}

最后的效果如下:

 

 


http://www.kler.cn/a/389653.html

相关文章:

  • vivo 游戏中心包体积优化方案与实践
  • GIS空间分析案例---城市公共设施配置与服务评价
  • jmeter常用配置元件介绍总结之后置处理器
  • Gurobi学术版+Anaconda安装步骤
  • GitHub Org
  • 利用 Screen 保持 VSCode 连接远程任务持续运行
  • Linux——gcc编译过程详解与ACM时间和进度条的制作
  • 批量从Excel某一列中找到符合要求的值并提取其对应数据
  • 【笔记】LLC电路工作频点选择 2-1 输出稳定性的限制
  • 数学建模-----假设性检验引入+三个经典应用场景(三种不同的假设性检验类型)
  • 【React】深入理解 JSX语法
  • ReactPress 安装指南:从 MySQL 安装到项目启动
  • Pr 视频过渡:沉浸式视频 - VR 随机块
  • 去中心化存储:Web3中的数据安全新标准
  • linux网络管理基本知识
  • dapp获取钱包地址,及签名
  • 阿里公告:停止 EasyExcel 更新与维护
  • LlamaIndex RAG实践 | 书生大模型
  • 【RabbitMQ】04-发送者可靠性
  • Spark中给读取到的数据 的列 重命名的几种方式!
  • 如何使用 Web Scraper API 高效采集 Facebook 用户帖子信息
  • 跨域及解决跨域
  • 使用腾讯地图的 IP 定位服务。这里是正确的实现方式
  • 字节青训-游戏排名第三大的分数、补给站最优花费问题
  • vite-plugin-electron 库作用
  • 细说STM32单片机USART中断收发RTC实时时间并改善其鲁棒性的另一种方法