wpf prism 《3》 弹窗 IOC

传统的弹窗 这种耦合度高

new 窗体() . Show();

new 窗体() . ShowDialog();

利用Prism 自动的 IOC 弹窗的 必须 必须 必须 页面控件

弹窗的 必须 必须 必须 页面控件

弹窗的 必须 必须 必须 页面控件

弹窗的 必须 必须 必须 页面控件

弹窗的 必须 必须 必须 页面控件

》》否则 报上面的错误


》》主程序

csharp 复制代码
<Window x:Class="BlankApp2.Views.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Title="{Binding Title}" Height="350" Width="525" >
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="50"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="10">
            <Button Content="弹窗1" Command="{Binding OpenCommand}" CommandParameter="Popup"></Button>
            <Button Content="弹窗2" Command="{Binding OpenCommand}" CommandParameter="UCPopup"></Button>
            <!--<Button Content="模块Student" Command="{Binding OpenCommand}" CommandParameter="ViewXX"></Button>
            <Button Content="模块C" Command="{Binding OpenCommand}" CommandParameter="ViewC"></Button>
            <Button Content="回退" Command="{Binding BackCommand}"></Button>-->
        </StackPanel>
        <ContentControl Grid.Row="1" prism:RegionManager.RegionName="ContentRegion" />
    </Grid>
</Window>

》》主程序对应的 ViewModel

csharp 复制代码
using Prism.Commands;
using Prism.Dialogs;
using Prism.Mvvm;
using Prism.Navigation;
using Prism.Navigation.Regions;
using System;
namespace BlankApp2.ViewModels
{
    public class MainViewModel : BindableBase
    {
        private string _title = "Prism Application";
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }
        public DelegateCommand<string> OpenCommand { get; private set; }
        public IDialogService DialogService { get; }
        public MainViewModel(IDialogService dialogService)
        {
            this.DialogService = dialogService;
            this.OpenCommand = new DelegateCommand<string>(Open);

        }
        private void Open(string obj)
        {
            //传递给弹窗的参数信息
            DialogParameters keys = new DialogParameters();
            keys.Add("zen", "============zen============");
            DialogService.ShowDialog(obj, keys, callback =>
            {
                if (callback.Result == ButtonResult.OK)
                {   
                   //弹窗传递的参数信息
                    string ss = callback.Parameters.GetValue<string>("Info");
                }
            });
        }


    }
}

》》》弹窗用户控件 、弹窗的ViewModel

csharp 复制代码
<UserControl x:Class="BlankApp2.Views.UCPopup"
             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:BlankApp2.Views"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="20"></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition Height="80"></RowDefinition>
        </Grid.RowDefinitions>
        <TextBlock Text="{Binding Title}"></TextBlock>
        <TextBlock Text="弹窗信息" FontSize="40" Grid.Row="1"></TextBlock>
        <StackPanel Orientation="Horizontal" Margin="10" HorizontalAlignment="Right" Grid.Row="2">
            <Button Content="确     定" Margin="10" Command="{Binding OKCommand}"></Button>
            <Button Content="取     消" Margin="10" Command="{Binding CancelCommand}"></Button>
        </StackPanel>
    </Grid>
</UserControl>
csharp 复制代码
using Prism.Commands;
using Prism.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BlankApp2.ViewModels
{
    public class UCPopupViewModel : IDialogAware
    {
        public string Title { get; set; }
        public DialogCloseListener RequestClose { get; set; }
        public DelegateCommand CancelCommand { get; set; }
        public DelegateCommand OKCommand { get; set; }
        public UCPopupViewModel()
        {
            CancelCommand = new DelegateCommand(Cancel);
            OKCommand = new DelegateCommand(OKcmd);
        }
        private void OKcmd()
        {
            DialogParameters keys = new DialogParameters();
            keys.Add("Info", "======INDO==========");
            RequestClose.Invoke(keys, ButtonResult.OK);
        }

        private void Cancel()
        {
            RequestClose.Invoke(ButtonResult.Cancel);
        }
        //是否准许关闭弹窗
        public bool CanCloseDialog()
        {
            return true;
        }
        //弹窗关闭时【窗体哪个 X】
        public void OnDialogClosed()
        {
            DialogParameters keys = new DialogParameters();
            keys.Add("Info", "======INDO==========");
            RequestClose.Invoke(keys, ButtonResult.OK);
            //throw new NotImplementedException();
        }
        //弹窗弹出时触发
        public void OnDialogOpened(IDialogParameters parameters)
        {
            if (parameters.ContainsKey("zen"))
            {
                this.Title = parameters.GetValue<string>("zen");
            }
            //throw new NotImplementedException();
        }
    }
}
相关推荐
没有bug.的程序员2 天前
SOA、微服务、分布式系统的区别与联系
java·jvm·微服务·架构·wpf·日志·gc
Macbethad2 天前
基于WPF的半导体设备配方管理程序技术方案
wpf
FuckPatience2 天前
WPF Geometry
wpf
武藤一雄3 天前
.NET 中常见计时器大全
microsoft·微软·c#·.net·wpf·.netcore
MarkHD3 天前
车辆TBOX科普 第70次 AUTOSAR Adaptive、容器化与云原生的融合革命
云原生·wpf
极客智造3 天前
WPF Behavior 实战:自定义 InvokeCommandAction 实现事件与命令解耦
wpf
L、2183 天前
Flutter 与 OpenHarmony 深度集成:构建分布式多端协同应用
分布式·flutter·wpf
布伦鸽3 天前
C# WPF -MaterialDesignTheme 找不到资源“xxx“问题记录
开发语言·c#·wpf
小二·4 天前
MyBatis基础入门《十五》分布式事务实战:Seata + MyBatis 实现跨服务数据一致性
分布式·wpf·mybatis
helloworddm4 天前
UnregisterManyAsync
wpf