winforms 检查表单是否已加载

6ovsh4lw  于 2023-04-12  发布在  其他
关注(0)|答案(6)|浏览(157)

我有两种形式。

  • 其中一个是主窗体(我们称之为MainForm)
  • 另一个是显示一些警告(我们称之为dialogForm)

. dialogForm中有一个标签。当我在MainForm中点击一个按钮时,dialogForm打开。但是dialogForm中的标签是空的。它实际上没有时间加载。我想检查dialogForm是否完全加载,然后进程可以在MainForm中继续。例如:

dialogForm tempFrm = new dialogForm();
tempFrm.Show(); // I want to wait till the dialogForm is fully loaded. Then continue to "while" loop.
while(..)
{
...
}
vkc1a9a2

vkc1a9a21#

为什么不创建一个布尔值和一个访问它的方法呢?

private bool Ready = false;

public ConstructorMethod()
{
    // Constructor code etc.
    Ready = true;
}

public bool isReady()
{
    return Ready;
}
6l7fqoea

6l7fqoea2#

您可以尝试以下操作

private bool Is_Form_Loaded_Already(string FormName)
            {
                foreach (Form form_loaded in Application.OpenForms)
                {
                    if (form_loaded.Text.IndexOf(FormName) >= 0)
                    {
                        return true;
                    }
                }
                return false;
            }

你也可以看看这个
Notification when my form is fully loaded in C# (.Net Compact Framework)?

yhqotfr8

yhqotfr83#

因此,您需要使用表单Shown事件:

tempFrm.Shown += (s, e) =>
{
    while(..)
    {
    }
}

但是你会遇到另一个问题。它会阻塞线程。你需要通过利用BackgroundWorkerThread在另一个线程上运行这个while循环。

watbbzwu

watbbzwu4#

while(...)阻塞了UI线程,因此子窗体将永远不会收到消息,也不会被加载。
为了实现你的目标,你应该订阅Load事件并在处理程序中继续你的代码。

void Click()
{
    var tempFrm = new dialogForm();
    tempFrm.Load += frmLoad;
    tempFrm.Show();
}

void frmLoad(object s, EventArgs ea)
{
   // form loaded continue your code here!
}
r8xiu3jd

r8xiu3jd5#

可以使用Form.IsActive属性。
或者只是;

public bool IsFormLoaded;

public MyForm()
    {
        InitializeComponent();
        Load += new System.EventHandler(FormLoaded);
    }
private void FormLoaded(object sender, EventArgs e)
    {
        IsFormLoaded = true;
    }

并检查YourForm.IsFormLoaded是否为true或false

lyfkaqu1

lyfkaqu16#

您可以检查窗体的Created属性。
获取一个值,该值指示控件是否已创建。
https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.control.created?view=windowsdesktop-8.0
下面是我如何使用它来检查在从另一个线程激活Form之前,它是否已经被创建:

public MyForm()
{

    ...
    
    public void beginInvokeActivate()
    {
        if (!Created) return;
        BeginInvoke(new Action(() =>
        {
            Activate();
        }));
    }
}

相关问题