有三个窗体,Login,Splash,Main程序启动加载Login,登录后本应进入Main窗体,但由于Main窗体加载时间过长,所以希望先显示Splash窗体,等Main窗体加载完毕后,Main显示,关闭Splash求教代码如何完成?
解决方案 »
- treeview 选中一个节点如何判断下面是否还有节点了
- 如何将数据填充到报表?
- 求助,,在线等。。
- DateGridView 那个事件是响应鼠标右键的???
- 如何把数据库的数据以 xls文件格式倒出?
- 在其他函数中调用函数 private void trvw_SelectedIndexChange(object sender, Microsoft.Web.UI.WebControls.TreeViewSelectEventArgs e
- 再开一贴求助下。关于异步委托的。
- 关于用C#做简单动画
- 如何理解"Control的Invoke/BeginInvoke与委托的Invoke和BeginInvoke是2个概念,不能混淆“?
- 比较麻烦的问题
- 想实现textbox弹出提示下拉框的效果
- 有偿 求助*.rs脚本文件转文本文件
{
Form2 ss = new Form2();
ss.Show();
for (int i = 0; i < 100000; i++)
{
button1.Text = i.ToString();
}
ss.Close();
}
经测试,,可以。。
重点是要分析Main窗体中为什么加载时间过长?通常都是由于查询数据库或一些计算引起的,可以将这部分内容放在线程中处理。
进入线程前先隐藏Main窗体,显示splash窗体。
进入线程,线程执行完毕后,关闭splash窗体,将数据显示/绑定到Main窗体,显示Main窗体。注意:在线程中是不能够直接访问UI元素的。具体实现可参阅MSDN,关键字BackgroupWorker
这样的活你的菜单中应该有登陆和注销,那这样的话你就可以使用项目管理器设置初始屏幕为splash窗体。启动窗体为main。在main窗体里加载必要的数据以及设置。在main窗体的Shown事件里显示登陆窗体。试试这样如何?
我自己做了一个闪屏类,专门用于加载我的主窗体时用。该类可实现启动和关闭时的渐隐渐现效果,动态显示正在加载的内容,多线程的准确的动态进度条(注意是准确的,不是类似于延时、循环等假的,只为了增强用户体验的那种)。
我一般在会在该类中检查程序的环境,数据库的可用否,网络连接可用否,是否缺失必要文件等等操作,加载完后,启动 LoadRunMainProgram函数来加载主窗体,窗体加载完后(注意是真实的加载完,不是利用延时等假的方法),关闭闪屏。主要代码如下
主程序Program.CS //弹出初始化界面
MySplash.ShowSplash(); MySplash.SetStatus("正在加载模块1......");
MySplash.SetStatus("正在加载模块2......");
MySplash.SetStatus("正在加载模块3......");
MySplash.SetStatus("正在加载模块4......");
MySplash.SetStatus("所有模块加载完毕");
Application.DoEvents();
//System.Threading.Thread.Sleep(5);
MySplash.SetStatus("正在加载主窗体");
MySplash.LoadRunMainProgram(new Form_Main());只需要把你的 Application.Run(new Form_Main()); 替换成 MySplash.LoadRunMainProgram(new Form_Main());就可以闪屏的LoadRunMainProgram 主要代码
static public void LoadRunMainProgram(Form form)
{
//订阅主窗体的句柄创建事件
form.HandleCreated += delegate
{
//启动新线程来显示Splash窗体
new Thread(new ThreadStart(delegate
{
form.Shown += delegate
{
//通知Splash窗体关闭自身
frmSplash.Invoke(new EventHandler(frmSplash.KillMe));
};
})).Start();
};
//显示主窗体
Application.Run(form);
}