在我的Windows窗体应用程序上显示“Spinning Wheel”

时间:2014-02-24 14:38:11

标签: c# winforms

我有一个Windows Forms应用程序,在我的应用程序中我将文件加载到列表框中,有时这可能需要几秒钟,所以在这段时间我想显示“旋转轮”,我发现这个Gif:{{ 3}} 当我的应用程序忙于控制器时,是否可以将它添加到我的应用程序中?

2 个答案:

答案 0 :(得分:2)

执行此操作的一个小技巧可能是使用带有图像的PictureBox。单击按钮,使PictureBox可见并在单击操作完成后再次隐藏它。

答案 1 :(得分:1)

从我拥有它的项目中找到一些旧代码。 编辑了一些东西,你应该能够轻松地使它工作。

调用它:

GuiCursor.WaitCursor(() => { yourclass.DoSomething(); });

班级

internal class GuiCursor
{

    private static GuiCursor instance = new GuiCursor();

    private GuiCursor() { }
    static GuiCursor() { }

    internal static void WaitCursor(MethodInvoker oper)
    {
        if (Form.ActiveForm != null && !Thread.CurrentThread.IsBackground)
        {
            Form myform = Form.ActiveForm;
            myform.Cursor = Cursors.WaitCursor;

            try
            {
                oper();
            }
            finally
            {
                myform.Cursor = Cursors.Default;
            }
        }
        else
        {
            oper();
        }
    }

    internal static void ToggleWaitCursor(Form form, bool wait)
    {
        if (form != null)
        {
            if (form.InvokeRequired)
            {
                form.Invoke(new MethodInvoker(() => { form.Cursor = wait? Cursors.WaitCursor : Cursors.Default; }));
            }
            else
            {
                form.Cursor = wait ? Cursors.WaitCursor : Cursors.Default;
            }
        }
    }

    internal static void Run(Form form)
    {
        try
        {
            Application.Run(form);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
}

按要求,一个例子。创建一个新的winform项目来测试它。 默认情况下,您获得Form1。添加一个按钮,双击它,这样就可以获得一个自动生成的方法。

将Form1替换为此类。

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

        private void button1_Click(object sender, EventArgs e)
        {
            GuiCursor.WaitCursor(() => { DoSomething(); });
        }

        private void DoSomething()
        {
            Thread.Sleep(3000);
        }
    }



    internal class GuiCursor
    {

        private static GuiCursor instance = new GuiCursor();

        private GuiCursor() { }
        static GuiCursor() { }

        internal static void WaitCursor(MethodInvoker oper)
        {
            if (Form.ActiveForm != null && !Thread.CurrentThread.IsBackground)
            {
                Form myform = Form.ActiveForm;
                myform.Cursor = Cursors.WaitCursor;

                try
                {
                    oper();
                }
                finally
                {
                    myform.Cursor = Cursors.Default;
                }
            }
            else
            {
                oper();
            }
        }

        internal static void ToggleWaitCursor(Form form, bool wait)
        {
            if (form != null)
            {
                if (form.InvokeRequired)
                {
                    form.Invoke(new MethodInvoker(() => { form.Cursor = wait ? Cursors.WaitCursor : Cursors.Default; }));
                }
                else
                {
                    form.Cursor = wait ? Cursors.WaitCursor : Cursors.Default;
                }
            }
        }

        internal static void Run(Form form)
        {
            try
            {
                Application.Run(form);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }