当显示对话框时,c#表单阻止其他控件

时间:2012-03-15 18:03:40

标签: c# forms

我的应用程序加载时我使用下面的代码显示进度条。问题是如果有人点击工具栏上下文菜单(退出的方式),它将被阻止,直到进度条关闭为止。有谁知道更好的方法来实现这一目标?

我使用ShowDialog的原因是,当我使用Show时,进度条不会动画 - 我正在使用MarqueeStyle。

由于

public partial class PopUpProgessBar : Form
{
    public PopUpProgessBar()
    {
        InitializeComponent();
    }

    Thread t;
    private void StartAnmiation()
    {
        this.Update();
        this.ShowDialog();
    }

    public void Stop()
    {
        if (t != null)
        { 
            t.Abort();
            t.Join();
        }
    }

    public void Start()
    {
        if (t == null)
        {
            t = new Thread(new ThreadStart(this.StartAnmiation));
            t.Start();
        }
    }

2 个答案:

答案 0 :(得分:2)

此代码看起来不太正确。你确定它不会引发跨线程违规吗?一般来说,你的整个比喻都是错误的。您需要在GUI线程上保留GUI。在后台线程上加载您的应用程序,并让它将进度更新发送到GUI线程。

答案 1 :(得分:1)

您的PopupProgressBar表单不应该负责在新线程中加载自己,这应该在您的主窗口中完成。

我会摆脱PopupProgressBar中的所有线程,并让它只是开始更新它的选框。然后,在你的主窗口(OnLoad)中,你告诉它做的事情:

        bool done = false;
        PopupProgressBar splashForm = null;
        ThreadPool.QueueUserWorkItem((x) =>
        {
            using (splashForm = new PopupProgressBar ())
            {
                splashForm.Show();
                while (!done)
                    Application.DoEvents();
                splashForm.Close();
            }
        });

        // do all your initialization work here
        // also, during each step of your initialization you could send call a function
        // in splashForm to update

        done = true;