c# - 我如何才能等到表单句柄创建后再使用其组件?

标签 c# winforms synchronization handle

我正在动态实例化一个表单。在创建句柄之前,我无法与窗体上的组件(例如 TextBox)交互(否则将抛出异常)。

目前我使用 while 循环阻塞线程:

public void OutputDesktopFrame(MessagingService service, DesktopFrame desktopFrame)
{
    IRemoteDesktopView view = GetView(service);
    view.UpdateFrame(desktopFrame);
}

private IRemoteDesktopView GetView(MessagingService service)
{
    T view;
    bool viewExists = _views.TryGetValue(service, out view);

    if (viewExists == false)
    {
        view = CreateAndShowView(service);
    }

    return view;
}

private T CreateAndShowView(MessagingService service)
{
    T remoteDesktopView = new T();

    _views.Add(service, remoteDesktopView);

    Thread pumpThread = new Thread(() => remoteDesktopView.ShowDialog());
    pumpThread.Start();


    while (remoteDesktopView.IsHandleCreated == false)
    {
        //Do not return until the handle has been created!
    }

    return remoteDesktopView;
}

我不喜欢这种机制。我正在寻找一个优雅 的解决方案。

请注意,我是针对接口(interface)进行编码的。我考虑过使用 ManualResetEvent 或类似的东西,但必须在实现接口(interface)的每个 Form 中实现和处理 ManualResetEvent 听起来对我没有吸引力。如果你不同意我的看法。那很好。我只是怀疑我目前的解决方案不是最优雅的。

最佳答案

您可以像这样向 HandleCreated 事件处理程序添加代码:

private void Form1_HandleCreated(object sender, EventArgs e){
   //your code
}

事件未在属性窗口中列出,您必须使用代码注册事件处理程序:

HandleCreated += Form1_HandleCreated;

关于c# - 我如何才能等到表单句柄创建后再使用其组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17423348/

相关文章:

java - 哪个线程通知唤醒?

c++ - Thread本地存储中静态类成员的销毁

c# - 缓存绝对过期是否保证缓存在准确的时间被淘汰?

c# - 增量创建字符串的所有排列 C#

c# - 无法抑制 WinForms 应用程序中的键

c# - WinForms(Windows 窗体)的等效 JDialog 是什么?

operating-system - 操作系统 : Peterson's solution

c# - 将.cs转换为.dll CS0246错误

c# - 如何创建位图深拷贝

c# - 如何判断何时在 TextBox 中按下了回车键?