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();
        }
    }
}
相关推荐
△曉風殘月〆11 小时前
如何在WPF中捕获窗口外的事件
wpf
爱吃烤鸡翅的酸菜鱼2 天前
Java 事件发布-订阅机制全解析:从原生实现到主流中间件
java·中间件·wpf·事件·发布订阅
武藤一雄3 天前
WPF中ViewModel之间的5种通讯方式
开发语言·前端·microsoft·c#·wpf
CSharp精选营3 天前
都是微软亲儿子,WPF凭啥干不掉WinForm?这3个场景说明白了
c#·wpf·跨平台·winform
baivfhpwxf20233 天前
wpf TextBlock 控件如何根据内容换行?
wpf
亘元有量-流量变现3 天前
鸿蒙、安卓、苹果音频设备技术深度解析与开发实践
android·wpf·harmonyos·亘元有量·积分墙
软泡芙3 天前
【Bug】ReactiveUI WPF绑定中依赖属性不更新的问题分析与解决方案
java·bug·wpf
浪扼飞舟3 天前
WPF输入验证(ValidationRule)
java·javascript·wpf
IOFsmLtzR4 天前
Flink Agents 源码解读 --- (5) --- ActionExecutionOperator
microsoft·flink·wpf
廋到被风吹走6 天前
【AI】Codex 复杂任务拆解:从“一气呵成“到“步步为营“
人工智能·wpf