首页 > 其他分享 >[Winform]在Form里显示模态对话框ModalDialog

[Winform]在Form里显示模态对话框ModalDialog

时间:2023-12-28 15:16:16浏览次数:31  
标签:parentContainer ModalDialog Form 对话框 ParentForm void CustomDialog public

在Form里显示模态Dialog

问题

如何在WinForm的一个Form里面弹出一个模态Dialog?

背景

程序的框架是Winform,只有一个窗口MainForm。MainForm里面是一个TabControl,每个TabPage是一个Form,每个TabPage的Form相互独立,互不干扰,TabPage间可以随时切换。由于有某些需求,TabPage需要接受用户输入,并等待输入完成,才能执行后面的代码,此时,程序是需要阻塞等待输入的,所以需要弹出一个模态Dialog。

  1. 为什么不用MessageBox呢?因为MessageBox是直接弹出一个模态对话框且该对话框是一个新的窗口,这时候整个MainForm是伪阻塞状态,用户无法通过与MainForm的其他区域交互,包括点击标签页切换到其他TabPage。所以,我需要该对画框只在Form里显示。
  2. 为什么不用MDI呢? 最主要的原因是TabControl里的Form,其TopLevel属性是false的,如果想在Form里面添加MDI窗口,需要将Form的TopLevel属性设置为true,这时我将无法使用TabControl。

代码实现

创建一个CustomDialog类,继承Form

public class CustomDialog : Form{

}

创建CustomDialog成员变量

  1. 这里使用到了两个类, PanelControlContainer。其中Panel充当CustomDialog的容器。ControlContainer则是Panel的容器。
public class CustomDialog : Form{
    private Panel? _panelContainer;
    private ControlContainer? _parentContainer;
    private Form? _parentForm;
    // 声明Panel,ControlContainer和Form
}

定义一个ShowDialog方法

要显示模态Dialog,当然要是实现ShowDialog方法啦!这里定义了一个ShowDialog方法,和其他ShowDialog方法有些许不同,该方法的参数是ControlContainer类型, 用于接收一个控件作为父控件

public class CustomDialog : Form{
    public void ShowDialog(ControlContainer parentControl){
        //TODO
    }

设置CustomDialog.PaneContainer的属性和内容

这部分代码最主要实现了CustomDialog在它的父控件Form中显示的功能,PS:有点简单粗暴,但是有效(_)

public class CustomDialog : Form{
    private void AddDialogToTheView(){
        if(ContainerControl is null){
            throw new NullReferenceException(nameof(_parentContainer));
        }
        //panel的高度
        int panelHeight = 350;
        int panelWidth = 500;
        
        //panel显示的位置
        int startUpLocationX = (_parentContainer.ClientSize.Width - panelWidth) / 2;
        int startUpLocationY = (_parentContainer.ClientSize.Height - panelHeight) / 2;
        
        // 设置_panelContainer的属性
        _panelContainer = new Panel(){
            Height = panelHeight,
            Width = panelWidth,
            Location = new Point(startUpLocationX, startUpLocationY),
        };

        // 设置Dialog的属性
        TopLevel = false;
        DockStyle = DockStyle.Fill;
        //添加进Panel里面
        _panelContainer.Controls.Add(this);
        Contianer.Controls.Add(_panelContainer);
        // 显示Dialog
        Show();
        PanelControl.BringToFront();
        
    }

}

实现伪阻塞

要说实现这个CustomDialog哪里最难,应该是这个伪阻塞功能最难。前面的View相关的方案,一般人稍微思考一下都可以想出来。但是想优雅的实现CustomDialog的伪阻塞功能,确实不易

  • 如何阻塞一段代码?
    我最初的做法是这样的:
public void WaitForExit(Cancellationtoken token){
    while(!toke.IsCancellationRequested){
        Application.DoEvents();
    }
}
CancellationTokenSource source = new CancellationTokenSource();
WaitForExit(source.Token);

//user cancel
source.Cancel();

这个写法有效,但还是不够优雅

标签:parentContainer,ModalDialog,Form,对话框,ParentForm,void,CustomDialog,public
From: https://www.cnblogs.com/echo-sama/p/17932701.html

相关文章

  • 小白看得懂的 Transformer (图解)
    1.导语谷歌推出的BERT模型在11项NLP任务中夺得SOTA结果,引爆了整个NLP界。而BERT取得成功的一个关键因素是Transformer的强大作用。谷歌的Transformer模型最早是用于机器翻译任务,当时达到了SOTA效果。Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快速并......
  • 全面解析MONAI Transforms的用法 视频+教程+代码
    MONAI提供了一系列的数据预处理操作,称之为transform。transform的目的是将原始数据转化为模型能够接受的格式,同时也可以进行一些数据增强操作,以提高模型的鲁棒性和泛化能力。MONAI中的transform分为两类:vanillatransform和dicttransform。在视频中都会详细介绍MONAI简介MONAI是......
  • Windows系统中Run对话框输入URL和IP地址的区别
    Windows系统中Run对话框输入URL和IP地址的区别在Windows系统中,我们可以通过Run对话框快速执行一些命令或者打开一些应用程序。当我们在Run对话框中输入URL(比如//www.baidu.com)和IP地址(比如\192.168.3.194)时,两者有一些区别。本篇博客将详细探讨这些区别。1.URL和IP地址的基本概......
  • 享元设计模式 和 享元设计模式在 FastDateFormat类中的应用
    1.概述享元设计模式(FlyweightPattern):通过尽量共享实例来避免new出实例。享元设计模式中有两个角色,一是要共享的实例,二是获取或创建这些共享实例的工厂。举一个例子:例如String常量池,大家创建的String常量,创建String的时候,先去常量池中看一下,有该String常量直接使用该常量,如果没......
  • 界面控件DevExpress WinForms PDF Viewer,让应用轻松显示PDF文档(二)
    DevExpressWinForms的PDFViewer(查看器)控件使用户可以轻松地在Windows应用程序中直接显示PDF文档,而无需在最终用户的机器上安装外部PDF阅读器。在上文中(点击这里回顾>>)我们为大家介绍了嵌入式PDF查看器、如何浏览PDF文件等,本文将继续介绍PDFViewer的打印、表单功能等,持续关注我......
  • Reformer 模型 - 突破语言建模的极限
    Reformer如何在不到8GB的内存上训练50万个词元Kitaev、Kaiser等人于20202年引入的Reformer模型是迄今为止长序列建模领域内存效率最高的transformer模型之一。最近,人们对长序列建模的兴趣激增,仅今年一年,就涌现出了大量的工作,如Beltagy等人的工作(2020)、Roy等......
  • 08.W3C performance api
    WebPerformanceWorkingGroupThemissionoftheWebPerformanceWorkingGroupistoprovidemethodstomeasureaspectsofapplicationperformanceofuseragentfeaturesandAPIs.Web性能工作组的使命是提供测量用户代理功能和AP!的应用程序性能方面的方法WebPerf......
  • java.net.MalformedURLException: no protocol异常处理
    摘要:本篇博客讨论了Java应用程序中可能遇到的java.net.MalformedURLException:noprotocol异常,并提供了解决方案。我们首先介绍了该异常的错误信息和可能的原因,然后提供了两种解决方案,一种是确保URL包含正确的通信协议,另一种是通过URL编码和解码来处理特殊字符和编码问题。我们......
  • 08-Informatica_schema获取元数据
    数据库的元数据即数据库对象的数据,如表,库,的属性数据等,存放在informatica——schema数据库中,已虚拟表的形式存在,只能读不能写一、获取元数据的方法查询INFORMATION_SCHEMA数据库表。其中包含MySQL数据库服务器所管理的所有对象的相关数据使用SHOW语句。用于获取数据库......
  • 在WInform开发中实现工具栏/菜单的动态呈现
    在Winform系统开发中,为了对系统的工具栏/菜单进行动态的控制,我们对系统的工具栏/菜单进行动态配置,这样可以把系统的功能弹性发挥到极致。通过动态工具栏/菜单的配置方式,我们可以很容易的为系统新增所需的功能,通过权限分配的方式,可以更有效的管理系统的菜单分配到不同的角色用户,也......