如何创建一个非模态表单但块?听起来应该很奇怪,但这只是我的爱好。我想要一个(自定义)消息框弹出一个YesNo按钮,理想情况下应该阻止代码。但我应该可以点击父窗体,这样我就可以关闭消息框而无需专门点击消息框按钮(相当于点击消息框中的否)。像这样:voidFoo(){CustomMsgBox.Show("你真的要删除吗?",CustomMsgBox.Buttons.YesNo);//在这里屏蔽代码,但用户应该可以点击表单,这样就相当于点击了否;//如果点击否,返回;//删除。所以我认为的解决方案是使自定义消息框成为非模态的-这样用户就可以单击表单,但我无法阻止代码..我该怎么做?它看起来像这样:voidFoo(){NonModalMsgBox.Show("你真的要删除吗?",CustomMsgBox.Buttons.YesNo);//阻塞线程直到用户点击表单或消息框按钮。//当用户点击时解锁。//如果否,返回;//删除。编辑:我知道这不是标准做法,而且我知道非模态形式不会阻塞,而模态形式会。所以请不要建议对模态或非模态形式的行为感到满意。我的问题是有没有办法用Windows窗体模拟ContextMenu的行为。你可以这样做:publicvoidShowMe(){Show();while(!_receivedDeactivateEvent)Application.DoEvents();我不确定我是否会推荐它-我不确定它会有多稳定,也不确定如果单击父表单上的“删除”按钮,它的行为是否符合您希望对话框的方式开始(它是先关闭第一个对话框,还是离开它?可能是后者,它可能会变得困惑)。你可以很容易地解决这个问题。创建并使用模态对话框,但覆盖对话框的WndProc并处理WM_MOUSEDOWN事件。检查鼠标在哪里,如果它在父窗口上方但不在对话框本身上方,则关闭对话框。基本上你不能在“拦截”电话中轻易做到这一点。您可以轻松地做的是将执行删除所需的信息或执行操作的委托传递给表单。单击“确定”后,您所要做的就是执行此操作。如果子窗体激活了父窗体,则关闭子窗体。您是否希望用户能够单击背景窗口以关闭对话框?向背景窗口添加一个处理程序,以检查当用户单击时是否显示无模式窗口,如果是则关闭它。听起来很简单,但您需要小心所有可能对背景窗口和子窗口的点击。这听起来像一堆蠕虫,我不想失望。也许您可以检测非模态对话框是否失去焦点并自动关闭它。我可以看到这种行为对于一个简单的“确认删除”对话框是有意义的,但作为用户,我的第一直觉是发送垃圾邮件ESC键来关闭对话框。另一种处理方法是在从此处调用ShowDialog时手动启用父窗体[DllImport("user32.dll")]privatestaticexternboolEnableWindow(IntPtrhWnd,boolenable);internalstaticDialogResultShowDialogSpecial(thisFormformToBeShown,Formparent){parent.BeginInvoke(newAction(()=>EnableWindow(parent.Handle,true)));formToBeShown.ShowDialog(父);返回formToBeShown.DialogResult;只需从任何父表单调用扩展方法,如下所示:varf=newForm();f.ShowDialogSpecial(this);//块,但父窗口将处于活动状态。当然,您需要处理父窗体上的点击以关闭子窗体。更简单的方法:将表单的“TopMost”属性设置为True。然后就会像blocking以上是C#学习教程:如何创建非模态窗体但是block?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
