首页 > 其他分享 >Prism弹窗

Prism弹窗

时间:2023-12-07 13:44:07浏览次数:18  
标签:窗口 void Prism ShowDialog dialogService public 弹窗

创建弹窗

创建弹窗内容

创建一个弹出窗口的内容:一般是UserControl(不是Window)

<UserControl x:Class="Zhaoxi.PrismDialog.UCDetail"
             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:Zhaoxi.PrismDialog"
             xmlns:p="http://prismlibrary.com/"
             mc:Ignorable="d"  FontSize="20" Foreground="Orange"
             d:DesignHeight="450" d:DesignWidth="800"
             Height="300" Width="500">
    <p:Dialog.WindowStyle>
        <Style TargetType="Window">
            <Setter Property="Width" Value="500"/>
            <Setter Property="Height" Value="300"/>
            <Setter Property="WindowChrome.WindowChrome">
                <Setter.Value>
                    <WindowChrome GlassFrameThickness="-1"/>
                </Setter.Value>
            </Setter>
        </Style>
    </p:Dialog.WindowStyle>
    <StackPanel>
        <TextBlock Text="弹出窗口内容"/>
        <TextBox Text="{Binding Value,UpdateSourceTrigger=PropertyChanged}"/>
        <Button Content="Close" Command="{Binding CloseCommand}"/>
    </StackPanel>
</UserControl>

使用Prism框架提供的Dialog.WindowStyle属性,修改窗体的样式

在UserControl中设置Height和Width属性,修改弹窗的初始大小

注册弹窗

对应的ViewModel实现IDialogAware接口

    public partial class UCDetail : UserControl
    {
        public UCDetail(IContainerProvider containerProvider)
        {
            InitializeComponent();
            this.DataContext = new DetailViewModel();
        }
    }
public class DetailViewModel : BaseVM, IDialogAware
    {
        // 弹出窗口的标题
        public string Title => "Hello Dialog";

        // 执行关闭返回
        public event Action<IDialogResult> RequestClose;

        // 当前打开的窗口是否允许关闭
        public bool CanCloseDialog()
        {
            return true;
        }

        // 当弹出窗口关闭时执行的逻辑
        public void OnDialogClosed()
        {

        }

        // 当弹出窗口打开的时候执行的逻辑
        public void OnDialogOpened(IDialogParameters parameters)
        {
 
        }
    }

 在RegisterTypes方法中注册弹窗

    public partial class App : PrismApplication
    {
        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            // 注册弹窗内容
            containerRegistry.RegisterDialog<UCDetail>("AAAA");
        }
    }

调用弹窗

注入IDialogService,使用ShowDialog方法调用弹窗

public MainViewModel(IEventAggregator eventAggregator, IDialogService dialogService)
{
    _dialogService = dialogService;
     OpenCommand = new DelegateCommand(OnOpen);
}

public DelegateCommand OpenCommand { get; set; }

private void OnOpen()
{
    //每次打开都是新的实例
    _dialogService.ShowDialog("AAAA");
}

创建弹窗窗口

对应的Window的窗口需要实现IDialogWindow接口

    public partial class DialogParent : Window, IDialogWindow
    {
        public DialogParent()
        {
            InitializeComponent();
        }

        public IDialogResult Result { get; set; }
    }

修改弹窗窗口样式

Title改为绑定

<Window x:Class="Zhaoxi.PrismDialog.DialogParent"
        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:Zhaoxi.PrismDialog"
        mc:Ignorable="d"  SizeToContent="WidthAndHeight"
        
        Title="{Binding Title}" Height="450" Width="800">
    <Window.Template>
        <ControlTemplate TargetType="Window">
            <Border CornerRadius="10" Background="Orange" Margin="5">
                <Border.Effect>
                    <DropShadowEffect BlurRadius="10" Color="Gray" ShadowDepth="0" Opacity="0.3"/>
                </Border.Effect>
                <ContentPresenter/>
            </Border>
        </ControlTemplate>
    </Window.Template>

</Window>

RegisterTypes中注册弹窗窗口即可

public partial class App : PrismApplication
 {
     protected override Window CreateShell()
     {
         return Container.Resolve<MainWindow>();
     }

     protected override void RegisterTypes(IContainerRegistry containerRegistry)
     {
         // 注册弹窗内容
         containerRegistry.RegisterDialog<UCDetail>("AAAA");
         // 注册弹窗窗口,这句代码会将框架内的默认弹窗窗口替换掉
         //弹窗窗体别名"fwefewfe",可以不填默认RegisterDialogWindow中填入的泛型名称-"DialogParent"
         containerRegistry.RegisterDialogWindow<DialogParent>("fwefewfe");
     }
 }
// 4、可以根据注册Dialog窗口的名称,使用特定的窗口对象
// 注册的窗口名称,如果指定了,在容器中必须存在这个名称的
// 否则报错:Exception:No registered type IDialogWindow with the key fwefewfe.
_dialogService.ShowDialog("AAAA", param, OnDialogClosed, "fwefewfe");

弹窗参数请求

弹窗传进参数

使用IDialogService提供的ShowDialog方法实现参数拆传递

// 摘要:
//     Shows a modal dialog.
//     显示模式对话框
// 参数:
//   name:
//     The name of the dialog to show.
//     要显示的对话框的名称。
//   parameters:
//     The parameters to pass to the dialog.
//     要传递给对话框的参数。
//   callback:
//     The action to perform when the dialog is closed.
//     对话框关闭时要执行的操作。
void ShowDialog(string name, IDialogParameters parameters, Action<IDialogResult> callback);

创建DialogParameters对象,并加入参数体

param.Add(参数名称, 参数内容)

private void OnOpen()
{
    DialogParameters param = new DialogParameters();
    param.Add("svsdvsf", "Hello Dialog");
    _dialogService.ShowDialog("AAAA", param, OnDialogClosed);
}

private void OnDialogClosed(IDialogResult result)
{
    
}

 弹窗对应的ViewModel中取出参数

// 当弹出窗口打开的时候执行的逻辑
public void OnDialogOpened(IDialogParameters parameters)
{
    string arg = parameters.GetValue<string>("svsdvsf");
}

弹窗返回参数

DialogResult创建对象,并加入参数体

触发IDialogAware提供的事件RequestClose触发回调,调用_dialogService.ShowDialog("AAAA", param, OnDialogClosed)中OnDialogClosed方法体

public DelegateCommand CloseCommand { get; set; }
public DetailViewModel()
{
    CloseCommand = new DelegateCommand(OnClose);
}
private void OnClose()
{
    IDialogResult dialogResult = new DialogResult();
    dialogResult.Parameters.Add("A", true);
    RequestClose?.Invoke(dialogResult);
}

标签:窗口,void,Prism,ShowDialog,dialogService,public,弹窗
From: https://www.cnblogs.com/ZHIZRL/p/17881822.html

相关文章

  • 技术分享丨 Prisma Cloud 增强云原生代码保护能力!
    现如今,企业业务向云计算转变已是主流,组织收到威胁、运营中断、威胁形势也持续升级,网络安全转型已变成当今企业的当务之急。Palo Alto PrismaCloud具有业界最广泛的安全性和合规性覆盖范围,它保护跨平台的云原生应用程序、数据、网络、计算、存储、用户和更高级别的PaaS+SaaS服务......
  • Prism使用Options选项
    Options是微软提供的选项模块,该模块依赖于容器使用。除了微软的IServiceCollection,当然也可以使用其它的依赖注入容器。本文演示如何在prism中使用Options。创建应用项目创建一个Avalonia应用(或其它类型应用),然后使用NuGet包管理器添加Prism.DryIoc.Avalonia包。创建Views和ViewM......
  • wpf学习 Prism 使用入门
    一、手动添加安装包Prism.DryIocapp.xaml.cs修改继承基类为:PrismApplication实现其中的抽象成员:CreateShell用于指定启动的窗口类1publicpartialclassApp:PrismApplication2{3protectedoverrideWindowCreateShell()4{5......
  • 实用功能分享,弹窗展示形式的6位卡号输入功能实现【玩转业务功能】
    前言本篇主要分享如何实现一个弹窗展示形式的6位卡号输入功能。6位卡号输入前面是根据卡的不同状态的流程实现,接下来,讲讲卡号输入的交互实现。卡号输入UIUI的呈现,会影响前端的实现方式。这里UI设计成弹出层的方式,每个数字都是一个方框。开发前在开发前,我列了一些可能出现的问题......
  • Wpf Prism 导航(参数传递,路由守卫,路由记录)
    十年河东,十年河西,莫欺少年穷学无止境,精益求精1、新建项目wpfApp5,添加Nuget引用,并初始化App.xaml及cs类 app.xaml如下:<Prism:PrismApplicationx:Class="WpfApp5.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="......
  • vue 弹窗组件
    vue弹窗<el-dialog></el-dialog>可以在其中编写所需的弹窗显示的内容也可以在其中放组件标签作为弹窗放一个组件的话,例:<el-dialogv-model="addGoodsDialog":title="addGoodsTitle"width="60%"destroy-on-close="true":close-on-p......
  • java后端实现前端弹窗
    Java后端实现前端弹窗教程简介在这篇文章中,我将教你如何使用Java后端实现前端弹窗。我们将使用SpringBoot框架来搭建后端服务,并通过前端发送请求来触发弹窗的显示。以下是整个实现过程的流程图:erDiagram程序员-->后端:创建后端服务后端-->前端:提供API前......
  • Wpf Prism初体验
    十年河东,十年河西,莫欺少年穷学无止境,精益求精1、项目引入 Prism.DryIoc  2、规则说明窗体必须放在Views文件夹下而且必须以View结尾,ViewModel必须放在ViewModels文件夹下面,文件必须以ViewModel结尾。在prism框架下,可以不为窗体设定数据上下文,但,在窗体中必须显示声明:......
  • 当多个使用弹窗类组件,可使用这种方式封装组件。(以下使用antd-vue、vue3)
    1.代码点击查看代码<template><slot:openDialog="openDialog":closDialog="modalCancel"></slot><a-modalv-model:open="open"title="BasicModal"@cancel="modalCancel"><templat......
  • 一行代码解决IE停用后无法继续使用IE弹窗功能的问题
    微软在2023年2月14日通过Edge浏览器更新,彻底封死IE。WindowsUpdate中没有记录、开始菜单中的IE以及桌面IE图标双击自动打开Edge,默认程序设置了IE也没有任何效果,仅能通过Edge浏览器设置IE模式浏览。但是之前通过这种方式使用IE最近发现无法弹窗了,而有些IE应用要求必须弹窗,在网上尝......