winforms 应用程序中对启动屏幕的不同要求
好吧,我知道这个问题之前已经被问过一百万次了(人们也以同样的方式开始他们的 StackOverflow 问题 XD),但我想知道如何实现以下目标:
- 应用程序首先启动一个登录框
- 如果登录成功,则必须显示启动屏幕(在单独的线程上)。
- 当显示启动屏幕时,必须用来自数据库的大量用户特定数据填充类对象(遵循单例模式),同时向用户显示它正在执行的操作(例如初始化...加载)数据...正在加载首选项...正在渲染工作区...完成!)
- 启动屏幕还必须等待主窗体在主线程上完成初始化,然后才能最终被处理。
这就是应用程序所需的流程。关闭主窗体后,用户应返回到登录框。
我必须预先声明,我对很多 winforms 的东西并不是那么了解,但是通过问这些问题,我正在慢慢学习。我一直在阅读有关线程的内容,并且了解到初始屏幕应该在自己的线程中生成,并使用委托从主线程提供状态更新(以适应 UI 的跨线程更新),并且这一切都应该在 Program.cs“Main()”子例程中完成。
我在这里伸出援手,因为我什至不知道从哪里开始,因为需要首先显示登录表单(然后在主表单关闭时最后显示)。我当然非常重视这方面的任何帮助。
非常感谢! 煞
Ok, I know this has been asked a million times before (and people also start off their StackOverflow question in the very same way XD), but I would like to know how to achieve the following:
- The application first launches a login box
- If the login is successful, then the splash screen must show (on a separate thread).
- While the splash screen is showing, a class object must be filled (that adheres to the Singleton pattern) with copious amounts of user-specific data from the DB, whilst displaying back to user what it is doing (eg. initializing...loading data...loading preferences...rendering workspace...done!)
- The splash screen must also wait for the main form to finish initializing on the main thread, before finally being disposed of.
That is the desire flow for the application. Upon closing the main form, the user should be returned to the login box.
I must state upfront that I am not all that clued up on alot of winforms stuff, but through asking these kind of questions, I am slowly learning. I have been doing some reading up on threading, and have learned that the splash screen should be spawned in its own thread, and feed status updates using delegates (to cater for cross-thread updates to the UI) from the main thread, and that this should all be done in the Program.cs "Main()" subroutine.
I am reaching out here, as I don't even know where to begin, due to the additional requirement of having the login form show first (and then last when the Main form is closed). I would certainly value any assistance in this regard.
Much thanks!
sha
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
下面是如何执行此操作的简单示例。诀窍是让登录框成为您的主窗体,因为它是第一个打开并最后关闭的窗体。
对于本示例,LoginScreen 表单有一个按钮,即“确定”按钮,单击该按钮时将调用 OnOK() 方法。
ApplicationWindow 表单相当于您所说的“主”表单。它是启动 SplashForm 的工具。
这是我使用的 SplashForm 的副本。它将根据您在静态 Show() 方法中指定的毫秒数淡入和淡出。
SplashForm 只是一个具有以下属性值的空白表单:
它还包含一个 System.Windows.Forms。名为 fadeTimer 的计时器控件,具有默认属性。 Tick 事件配置为调用 OnTick() 方法。
这不会更新加载过程的状态。也许其他人可以为您填写该部分。
Here's a simple example of how to do this. The trick is to make the login box your main form since it's the one that opens first and closes last.
For this example, the LoginScreen form has one button, an OK button that invokes the OnOK() method when clicked.
The ApplicationWindow form would equate to what you referred to as your "main" form. It is what launches the SplashForm.
And here's a copy of the SplashForm I use. It will fade in and fade out based on the number of milliseconds you specify in the static Show() method.
The SplashForm is just a blank form with the following property values:
It also contains a System.Windows.Forms.Timer control named fadeTimer with the default properties. The Tick event is configured to invoke the OnTick() method.
What this does not do is update the status of the loading process. Perhaps someone else can fill in that portion for you.