我正在动态实例化一个表单。在创建句柄之前,我无法与窗体上的组件(例如 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/