用Winform中委托和线程自制一个加载界面,有进度条显示,有资源信息名称显示,加载完成后加载界面关闭,显示正常主界面
时间: 2024-03-21 09:42:41 浏览: 57
好的,我理解了你的问题。以下是一个基本的加载界面实现的示例代码,你可以根据需要进行修改和优化。
首先,我们需要创建一个窗体,用于展示加载界面。窗体中包含一个进度条控件和一个标签控件,用于显示资源信息名称。在窗体的构造函数中,我们可以初始化进度条的最小值和最大值,并将进度条的初始值设为最小值。
```csharp
public partial class LoadingForm : Form
{
public LoadingForm()
{
InitializeComponent();
progressBar.Minimum = 0;
progressBar.Maximum = 100;
progressBar.Value = 0;
}
}
```
接下来,我们可以定义一个委托类型,用于更新进度条和标签控件的值。该委托类型接受两个参数,分别为进度条的值和资源信息名称。
```csharp
delegate void UpdateLoadingDelegate(int progressValue, string resourceName);
```
然后,我们可以在加载界面中定义一个方法,用于更新进度条和标签控件的值。该方法接受两个参数,分别为进度条的值和资源信息名称。在该方法中,我们可以通过委托类型实例化一个委托对象,并通过调用窗体的 Invoke 方法在 UI 线程中执行该委托,从而更新进度条和标签控件的值。
```csharp
private void UpdateLoading(int progressValue, string resourceName)
{
if (this.InvokeRequired)
{
UpdateLoadingDelegate updateDelegate = new UpdateLoadingDelegate(UpdateLoading);
this.Invoke(updateDelegate, new object[] { progressValue, resourceName });
}
else
{
progressBar.Value = progressValue;
labelResourceName.Text = resourceName;
}
}
```
接下来,我们可以定义一个线程,用于加载资源。在线程中,我们可以通过循环模拟资源加载的过程,并在每次循环中调用更新进度条和标签控件的方法,从而更新加载界面的显示。
```csharp
private void LoadResources()
{
for (int i = 0; i <= 100; i++)
{
UpdateLoading(i, "Resource " + i.ToString());
Thread.Sleep(50);
}
}
```
最后,我们可以在加载界面的 Load 事件中启动线程,并在线程执行完成后关闭加载界面,并打开正常主界面。
```csharp
private void LoadingForm_Load(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(LoadResources));
thread.Start();
thread.Join();
this.Close();
MainForm mainForm = new MainForm();
mainForm.Show();
}
```
完整的代码示例如下所示:
```csharp
public partial class LoadingForm : Form
{
delegate void UpdateLoadingDelegate(int progressValue, string resourceName);
public LoadingForm()
{
InitializeComponent();
progressBar.Minimum = 0;
progressBar.Maximum = 100;
progressBar.Value = 0;
}
private void UpdateLoading(int progressValue, string resourceName)
{
if (this.InvokeRequired)
{
UpdateLoadingDelegate updateDelegate = new UpdateLoadingDelegate(UpdateLoading);
this.Invoke(updateDelegate, new object[] { progressValue, resourceName });
}
else
{
progressBar.Value = progressValue;
labelResourceName.Text = resourceName;
}
}
private void LoadResources()
{
for (int i = 0; i <= 100; i++)
{
UpdateLoading(i, "Resource " + i.ToString());
Thread.Sleep(50);
}
}
private void LoadingForm_Load(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(LoadResources));
thread.Start();
thread.Join();
this.Close();
MainForm mainForm = new MainForm();
mainForm.Show();
}
}
```
希望这个示例代码可以帮助你实现你的需求。如果你有任何问题或需要进一步帮助,请随时提出。
阅读全文