WinForms ShowDialog()-未打开任何模式对话框

WinForms ShowDialog()-未打开任何模式对话框,winforms,showdialog,Winforms,Showdialog,我想在浏览器名称空间扩展中打开一个对话框作为登录框。当我第一次调用ShowDialog()时,该框将打开,但不是作为模式对话框。我可以单击资源管理器中的元素。如果我关闭这些对话框并再次打开,它将是一个模式对话框,无法与资源管理器进行交互。这就是我想在第一场公开赛中实现的目标 我的想法是首先从错误的线程调用表单。这就是我使用以下代码的原因,但它不能解决问题:/ public delegate void myDelegate(); public void ShowDialogThreadS

我想在浏览器名称空间扩展中打开一个对话框作为登录框。当我第一次调用ShowDialog()时,该框将打开,但不是作为模式对话框。我可以单击资源管理器中的元素。如果我关闭这些对话框并再次打开,它将是一个模式对话框,无法与资源管理器进行交互。这就是我想在第一场公开赛中实现的目标

我的想法是首先从错误的线程调用表单。这就是我使用以下代码的原因,但它不能解决问题:/

public delegate void myDelegate();

    public void ShowDialogThreadSave()
    {
        if (this.InvokeRequired)
        {
            myDelegate d = new myDelegate(ShowDialogThreadSave);
            this.Invoke(d);
        }
        else
        {
            this.ShowDialog();
        }
    }
我希望你有个想法:-) 谢谢

编辑: 调用是从后台类激发的。我有3种可能登录到分机,因此我封装了呼叫:

public bool LogIn()
        {
            bool connected = BackEnd.isConnected();

            if(loginDialog == null)
            {
                LogIn logIn = new LogIn();
            }
            else
            {
                if (!connected && !Utils.AlreadyLoggedIn() && !loginDialog.IsAccessible && !loginDialog.Visible)
                    loginDialog.ShowDialogThreadSave();
                else if (!connected && !Utils.AlreadyLoggedIn() && !loginDialog.Visible)
                    loginDialog.ShowDialogThreadSave();
                else if (!connected && !Utils.AlreadyLoggedIn() && loginDialog.Visible)
                    LOG.DebugFormat("error");
                else
                    Utils.ConnectWithoutLoginWindow();
            }
            connected = BackEnd.isConnected();

            return connected;
        }

Edit2:通过调试,我发现ShowDialogThreadSave()总是由UI线程调用,我永远不会使用if。。。问题是什么?

第一次调用此方法的上下文是什么?您能显示运行此方法的代码以及它的位置吗?我编辑了我的问题您在哪里创建
loginDialog
?(在UI线程上?)如果
InvokeRequired
为false,这只会告诉您处于创建它的同一线程中,不一定是UI线程(检查线程ID)。另一方面,在显示表单之前,
InvokeRequired
总是处处为false。@KekuSemau我在一个类中创建它来处理登录。这个类由内置函数调用,我不知道UIThread是否调用它。如何确定它是否是UIThread?我在UI线程外部调用
loginDialog
。正因为如此,我想使用
Application.Current.Dispatcher.CheckAccess()
Application.Current.Dispatcher.Invoke(new System.Action(()=>logInMethod())但我的应用程序没有当前线程。第一次调用此方法的上下文是什么?您能显示运行此方法的代码以及它的位置吗?我编辑了我的问题您在哪里创建
loginDialog
?(在UI线程上?)如果
InvokeRequired
为false,这只会告诉您处于创建它的同一线程中,不一定是UI线程(检查线程ID)。另一方面,在显示表单之前,
InvokeRequired
总是处处为false。@KekuSemau我在一个类中创建它来处理登录。这个类由内置函数调用,我不知道UIThread是否调用它。如何确定它是否是UIThread?我在UI线程外部调用
loginDialog
。正因为如此,我想使用
Application.Current.Dispatcher.CheckAccess()
Application.Current.Dispatcher.Invoke(new System.Action(()=>logInMethod())但我的应用程序没有当前线程。