打开的非模态对话框在后打开的模态对话框中激活使用

ralph83 2017-09-06 12:05:37
一个winform程序

先是打开一个非模态的对话框
然后再打开一个模态的对话框,这个时候如果点出原来的非模态对话框,原来的非模态对话框里面的控件等什么也点不了,不知怎么解决,各位大神。
...全文
214 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2017-09-06
  • 打赏
  • 举报
回复
引用 3 楼 ralph83 的回复:
private void tsHistoryPrice_Click(object sender, EventArgs e)
            {
                  foreach (Form frm in Application.OpenForms)
                  {
                        if (frm is frmProductHistoryPrice)
                        {                              
                              //frm.Activate();                              
                              EnableWindow(frm.Handle, true);
                              return;
                        }
                  }
                  frmProductHistoryPrice form2 = new frmProductHistoryPrice();
                  form2.Show(this);
            }

            [System.Runtime.InteropServices.DllImport("user32.dll")]
            [return: System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)]
            static extern bool EnableWindow(IntPtr hWnd, bool bEnable);
好像没啥反应
写在模态弹出以后
ralph83 2017-09-06
  • 打赏
  • 举报
回复
private void tsHistoryPrice_Click(object sender, EventArgs e)
            {
                  foreach (Form frm in Application.OpenForms)
                  {
                        if (frm is frmProductHistoryPrice)
                        {                              
                              //frm.Activate();                              
                              EnableWindow(frm.Handle, true);
                              return;
                        }
                  }
                  frmProductHistoryPrice form2 = new frmProductHistoryPrice();
                  form2.Show(this);
            }

            [System.Runtime.InteropServices.DllImport("user32.dll")]
            [return: System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)]
            static extern bool EnableWindow(IntPtr hWnd, bool bEnable);
好像没啥反应
threenewbee 2017-09-06
  • 打赏
  • 举报
回复
试试看调用AP{ EnableWindow(传你的非模态框.Handle, true); 需要如下定义 [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool EnableWindow(IntPtr hWnd, bool bEnable);
ralph83 2017-09-06
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
凡事都要合情合理,不要太任性! 模式窗口会挂起主窗体的程序流程,这是他的基本特征,最初就是这样设计的,不可更改。否则就不叫模态了 你可用一个总在前面(TopMost = True)的窗口来模拟模态对话框
的确,不能太任性,换了一种变通的方法,就是在模态窗口中,有一个按钮如果要激活非模态窗口,那么先把之前的owner不属于自己的关闭,然后再重开一个,就可以解决问题了。
xuzuning 2017-09-06
  • 打赏
  • 举报
回复
凡事都要合情合理,不要太任性! 模式窗口会挂起主窗体的程序流程,这是他的基本特征,最初就是这样设计的,不可更改。否则就不叫模态了 你可用一个总在前面(TopMost = True)的窗口来模拟模态对话框

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧