ToB企服应用市场:ToB评测及商务社交产业平台

标题: [Winform]在Form里显示模态对话框ModalDialog [打印本页]

作者: 大连密封材料    时间: 2024-3-5 15:02
标题: [Winform]在Form里显示模态对话框ModalDialog
在Form里显示模态Dialog

问题

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

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

创建一个CustomDialog类,继承Form类
  1. public class CustomDialog : Form{
  2. }
复制代码
创建CustomDialog成员变量

  1. public class CustomDialog : Form{
  2.     private Panel? _panelContainer;
  3.     private ControlContainer? _parentContainer;
  4.     private Form? _parentForm;
  5.     // 声明Panel,ControlContainer和Form
  6. }
复制代码
定义一个ShowDialog方法

要显示模态Dialog,当然要是实现ShowDialog方法啦!这里定义了一个ShowDialog方法,和其他ShowDialog方法有些许不同,该方法的参数是ControlContainer类型, 用于接收一个控件作为父控件
  1. public class CustomDialog : Form{
  2.     public void ShowDialog(ControlContainer parentControl){
  3.         //TODO
  4.     }
复制代码
设置CustomDialog.PaneContainer的属性和内容

这部分代码最主要实现了CustomDialog在它的父控件Form中显示的功能,PS:有点简单粗暴,但是有效(_)
  1. public class CustomDialog : Form{
  2.     private void AddDialogToTheView(){
  3.         if(ContainerControl is null){
  4.             throw new NullReferenceException(nameof(_parentContainer));
  5.         }
  6.         //panel的高度
  7.         int panelHeight = 350;
  8.         int panelWidth = 500;
  9.         
  10.         //panel显示的位置
  11.         int startUpLocationX = (_parentContainer.ClientSize.Width - panelWidth) / 2;
  12.         int startUpLocationY = (_parentContainer.ClientSize.Height - panelHeight) / 2;
  13.         
  14.         // 设置_panelContainer的属性
  15.         _panelContainer = new Panel(){
  16.             Height = panelHeight,
  17.             Width = panelWidth,
  18.             Location = new Point(startUpLocationX, startUpLocationY),
  19.         };
  20.         // 设置Dialog的属性
  21.         TopLevel = false;
  22.         DockStyle = DockStyle.Fill;
  23.         //添加进Panel里面
  24.         _panelContainer.Controls.Add(this);
  25.         Contianer.Controls.Add(_panelContainer);
  26.         // 显示Dialog
  27.         Show();
  28.         PanelControl.BringToFront();
  29.         
  30.     }
  31. }
复制代码
实现伪阻塞

要说实现这个CustomDialog哪里最难,应该是这个伪阻塞功能最难。前面的View相关的方案,一般人稍微思考一下都可以想出来。但是想优雅的实现CustomDialog的伪阻塞功能,确实不易
  1. public void WaitForExit(Cancellationtoken token){
  2.     while(!toke.IsCancellationRequested){
  3.         Application.DoEvents();
  4.     }
  5. }
  6. CancellationTokenSource source = new CancellationTokenSource();
  7. WaitForExit(source.Token);
  8. //user cancel
  9. source.Cancel();
复制代码
这个写法有效,但还是不够优雅
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4