在具有句柄之前,是否可以在.NET中访问该表单?

时间:2012-10-10 12:40:39

标签: c# winforms

我在Control内遇到了一段奇怪的代码。

if (ParentForm != null)
{
  traceBlock.Log("ParentForm is null");

  if (!ParentForm.IsHandleCreated)
  {
    ParentForm.HandleCreated += (sender, e) =>
        {
          var text = PhysDocContext.Document.GetHeader(PhysDocContext);
          ParentForm.Text = text;
        };
  }
}

此代码使用ParentForm == null触发几次。很明显记录器记录的信息不准确。奇怪的是,检查IsHandleCreated是什么让我感到奇怪。在我看来,这段代码永远不会激发。因此事件不会挂钩,并且永远不会设置标头。

更奇怪的是,ParentForm被设置为父表单拥有的Panel控件。它也由作为父级的Form设置。让我相信这是一个更不可能的情况。

在没有句柄的.NET中可以访问Form是否正常(甚至可能)?

2 个答案:

答案 0 :(得分:2)

是的,这是可能的。句柄是窗体的窗口句柄,在窗体实际上有一个窗口(可见或不可见)之前,它可能不会被创建。

答案 1 :(得分:2)

  

在没有句柄的.NET中可以访问Form是否正常(甚至可能)?

是的,因为Form(或者那个控件)只是围绕几个Win32 API调用的包装类。用于创建表单的代码用于创建.NET对象。

最有可能只有在显示表单时,才会调用Win32,最后给控件一个句柄。