C# 无法对尚未创建的控件调用Invoke或begininvoke
我有一个正常的C# 无法对尚未创建的控件调用Invoke或begininvoke,c#,winforms,C#,Winforms,我有一个正常的Windows窗体应用程序,但出现以下错误: Invoke or begininvoke cannot be called on a control which is not yet created. 这在以下代码中发生: Application.ThreadException += Application_ThreadException; Application.EnableVisualStyles(); Application.SetCompatibleTextRenderi
Windows窗体
应用程序,但出现以下错误:
Invoke or begininvoke cannot be called on a control which is not yet created.
这在以下代码中发生:
Application.ThreadException += Application_ThreadException;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var args = new string[0];
new MyApp().Run(args);
我使用的是闪屏,我认为这就是问题的根源
这是如何解决的?为什么要向自己的应用程序传递参数?
Windows窗体
应用程序的默认入口点定义不接受任何参数,因此您是否手动更改了此定义
但是,要解决您的问题,请尝试使用以下方法:
Application.Run(new YourMainForm());
因此,最终:
Application.ThreadException += Application_ThreadException;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new YourMainForm());
为了检索由执行器传递给应用程序的参数,可以使用公开
GetCommandLineArgs
方法的Environment
类。因此,如果您需要确定这些值,您可以A)调用此方法,通过属性或类似的方式解析并以强类型格式存储,或者B)调用此方法,根据需要解析,比如从表单中解析。为什么要将参数传递给您自己的应用程序?Windows窗体
应用程序的默认入口点定义不接受任何参数,因此您是否手动更改了此定义
但是,要解决您的问题,请尝试使用以下方法:
Application.Run(new YourMainForm());
因此,最终:
Application.ThreadException += Application_ThreadException;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new YourMainForm());
为了检索由执行器传递给应用程序的参数,可以使用公开
GetCommandLineArgs
方法的Environment
类。因此,如果您需要确定这些值,您可以A)调用此方法,通过属性或类似的方式解析并以强类型格式存储,或者B)调用此方法,根据需要解析,例如,从表单中解析。我刚刚找到的一篇旧帖子-似乎有一个MS错误再次出现,虽然有些机器似乎比其他机器受到的影响更严重,但这似乎几乎是随机的
谢谢你给我指了指周围的工作
诀窍是帮助框架实现启动屏幕何时实际可用,方法是在正确创建启动屏幕之前不要让它隐藏启动
因此,添加一个SplashLoadFinished
标志作为用户设置或类似设置
然后在Splash表单中设置此标志。Load
事件(下面的行必须分别是第一行和最后一行):
Private子表单\u Load(发送方作为对象,e作为System.EventArgs)处理Me.Load
My.Settings.SplashLoadFinished=False
...
My.Settings.SplashLoadFinished=真
端接头
然后在ApplicationEvents
Startup
事件中放置一个等待循环:
Private Sub MyApplication\u Startup(发送者作为对象,e作为应用程序服务.StartupEventArgs)处理我。Startup
...
如果(Me.SplashScreen不是什么)那么
'等待,直到实际创建了飞溅
While(不是My.Settings.SplashLoadFinished)
系统线程线程睡眠(50)
结束时
如果结束
...
我刚刚点击的一篇老帖子——似乎有一个微软的bug突然冒了出来,看起来几乎是随机的,尽管有些机器似乎比其他机器受到的影响更严重
谢谢你给我指了指周围的工作
诀窍是帮助框架实现启动屏幕何时实际可用,方法是在正确创建启动屏幕之前不要让它隐藏启动
因此,添加一个SplashLoadFinished
标志作为用户设置或类似设置
然后在Splash表单中设置此标志。Load
事件(下面的行必须分别是第一行和最后一行):
Private子表单\u Load(发送方作为对象,e作为System.EventArgs)处理Me.Load
My.Settings.SplashLoadFinished=False
...
My.Settings.SplashLoadFinished=真
端接头
然后在ApplicationEvents
Startup
事件中放置一个等待循环:
Private Sub MyApplication\u Startup(发送者作为对象,e作为应用程序服务.StartupEventArgs)处理我。Startup
...
如果(Me.SplashScreen不是什么)那么
'等待,直到实际创建了飞溅
While(不是My.Settings.SplashLoadFinished)
系统线程线程睡眠(50)
结束时
如果结束
...
此代码片段不是很有用,也不完整,是否要重试?如果您将new MyApp().Run(args)
行取出,应该可以解决问题;或者更有用一点,@Lazarus说,这可能就是它的开始。不发布代码==无解决方案。使用内置的.NET对启动屏幕的支持,而不是自己制作:此代码片段不是很有用,也不完整,是否要重试?如果您使用new MyApp().Run(args)
行,应该可以解决问题;或者更有用一点,@Lazarus说,这可能就是它的开始。不发布代码==无解决方案。使用内置的.NET对启动屏幕的支持,而不是自己制作:之所以这样做,是因为启动屏幕是如何被调用的。启动屏幕不是一个表单
?用一个新的闪屏表单实例启动应用程序。我刚刚试过,但是关闭它并显示主表单的最佳方法是什么?我不能得到一个可靠的转换,他们似乎都关闭等,很难给你一个理想的解决方案,因为我不知道你的项目,这里有有限的时间和空间,但一种方法是让你的启动屏幕做任何需要做的加载前加载主窗体;另一种方法是最初加载主窗体,显示启动屏幕,隐藏主窗体,隐藏启动屏幕,然后重新显示主窗体-显然,所有这些都是适当的时间。这一行的原因是启动屏幕是如何调用的。启动屏幕不是一个窗体
?使用new
splash启动应用程序