【问题标题】:How to hide a modal dialog without returning from .ShowDialog?如何隐藏模态对话框而不从.ShowDialog返回?
【发布时间】:2010-03-11 22:05:48
【问题描述】:

我在 vb.net 中有一个以子函数开头的应用程序,它会做一些事情并决定它是否显示自己。当它显示自己时,它通过调用 dialog.ShowDialog() 来显示自己。

dialog.ShowDialog() 返回时,应用程序会进行一些清理并结束。

我想找到一种方法来临时隐藏对话框(将其发送到系统托盘)而不从 ShowDialog() 函数返回。但是,只要我在表单的代码中执行me.Hide(),表单就会被有效隐藏,但 ShowDialog() 函数会返回并关闭进程。

我了解这是预期的行为。所以我的问题是我怎样才能得到这种效果?那就是启动一个可以隐藏的对话框,并阻止直到用户真正想要退出应用程序。

【问题讨论】:

标签: .net winforms modal-dialog


【解决方案1】:

如果隐藏对话框,从 ShowDialog() 返回。忘记试图改变它,你不能。

您也许可以最小化对话框。

form1.WindowState = FormWindowState.Minimized;

或者您可以将其置于屏幕外。

form.Left = -16384;

或者你可以让它透明Modifying opacity of any window from C#

【讨论】:

  • 如果要最小化,请确保 ShowInTaskbar = true。
【解决方案2】:

您无法完成这项工作,ShowDialog() 将始终在表单隐藏时返回。诀窍是使用常规形式和对 Application.Run() 的正常调用,但要防止它立即变得可见。将此代码粘贴到您的表单类中:

Protected Overrides Sub SetVisibleCore(ByVal value As Boolean)
    If Not IsHandleCreated Then
        CreateHandle()
        value = false
    End If
    MyBase.SetVisibleCore(value)
End Sub

请注意,在表单真正可见之前,您的 Load 事件处理程序不会运行,因此请务必在 Sub New 构造函数中进行任何初始化。

【讨论】:

    【解决方案3】:

    另一种解决方法是将建模表单的 Opacity 属性更改为 0 以使其完全透明。

    private void MyModalForm_Load(object sender, EventArgs e)
    {
        bool isShowing = true;
        //Do your thing.
        if(!isShowing) this.Opacity = 0.0;
        else this.Opacity = 1.0;
    }
    

    【讨论】:

    • 不透明度是个好主意,它不会破坏 ShowDialog 的行为
    【解决方案4】:

    我这样做了,在代码表单中:

    private bool CanAccess()
    {
        //your condition to access or not
    }
    
    private bool AlreadyCreated = false;
    protected override void SetVisibleCore(bool value)
    {
        if (value && !AlreadyCreated && !CanAccess())
        {
            base.SetVisibleCore(false);
            this.Close();
            return;
        }
    
        AlreadyCreated = true;
        base.SetVisibleCore(value);
    }
    

    它适用于 Show() 和 ShowDialog() 方法。

    【讨论】:

      【解决方案5】:

      你可以使用一个标志。

      1. 在表单中添加标志:bool done = false;
      2. 在完成时设置 done = true(在 FormClosed 事件中)。
      3. 检查调用函数中的标志(完成了吗?)

        bool stilInMyFrm = false;
        MyFrm myFrm = new myFrm();
        
        try
        {
            stilInMyFrm = true;
            myFrm.ShowDialog();
            while (!myFrm.done)
                Application.DoEvents();
        }
        finally
        {
            stilInMyFrm = false;
            cleanup();
        }
        

      【讨论】:

        猜你喜欢
        • 2019-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-15
        • 2010-09-19
        • 1970-01-01
        • 2010-10-29
        相关资源
        最近更新 更多