WPF中Prism框架的简单使用

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

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

自动匹配导入

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

cs 复制代码
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如下:

XML 复制代码
<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如下:

cs 复制代码
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如下:

XML 复制代码
<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如下:

cs 复制代码
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如下:
XML 复制代码
<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 如下:
cs 复制代码
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
    {

    }
}
XML 复制代码
<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>
cs 复制代码
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如下:

XML 复制代码
<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 如下:

cs 复制代码
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如下:

XML 复制代码
<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如下:

cs 复制代码
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
    {

    }
}

最后的效果如下:

相关推荐
界面开发小八哥4 小时前
界面控件DevExpress WPF中文教程:TreeList视图及创建分配视图
.net·wpf·界面控件·devexpress·ui开发
月落.6 小时前
WPF Prism中的区域(Region)管理
wpf·prism
林子漾1 天前
【paper】分布式无人水下航行器围捕智能目标
分布式·wpf
wyh要好好学习1 天前
C# WPF 记录DataGrid的表头顺序,下次打开界面时应用到表格中
开发语言·c#·wpf
lgcgkCQ2 天前
任务调度中心-XXL-JOB使用详解
java·wpf·定时任务·任务调度
Vicky&James2 天前
英雄联盟客户端项目:从跨平台Uno Platform到Win UI3的转换只需要30分钟
github·wpf·跨平台·英雄联盟·winui·unoplatform
就是有点傻2 天前
WPF中如何使用区域导航
wpf
她说彩礼65万2 天前
WPF程序设置单例启动(互斥体)
wpf
就是有点傻2 天前
WPF中Prism框架中 IContainerExtension 和 IRegionManager的作用
wpf