C# 在Windows窗体程序为“时显示微调器”;加工;,类似于ajaxStart/ajaxStop?

C# 在Windows窗体程序为“时显示微调器”;加工;,类似于ajaxStart/ajaxStop?,c#,.net,ajax,winforms,C#,.net,Ajax,Winforms,对,对。我知道它们是两种完全不同的技术。最近,我从web开发转向使用C#和Windows窗体进行FAT开发。我一直认为使用ajaxStart和ajaxStop显示微调器非常容易,因此用户知道发生了什么,并继续等待 对于C#Windows窗体是否有一种可以全局实现的同等简单的技术?例如,如果我正在查询一个数据库并等待一些结果,通常程序会在几秒钟内没有响应,然后在“处理”后重新开始工作。当我的程序正在“处理”时,是否有一些全局方法可以显示微调器,而不是识别程序中所有可能导致它变得无响应并只剥离新线程

对,对。我知道它们是两种完全不同的技术。最近,我从web开发转向使用C#和Windows窗体进行FAT开发。我一直认为使用ajaxStart和ajaxStop显示微调器非常容易,因此用户知道发生了什么,并继续等待

对于C#Windows窗体是否有一种可以全局实现的同等简单的技术?例如,如果我正在查询一个数据库并等待一些结果,通常程序会在几秒钟内没有响应,然后在“处理”后重新开始工作。当我的程序正在“处理”时,是否有一些全局方法可以显示微调器,而不是识别程序中所有可能导致它变得无响应并只剥离新线程的点


如果我不清楚,请告诉我。

标准的Windows窗体方法是
Cursor.Current=Cursors.WaitCursor

这对你有用吗,还是必须是图像?

是的

简单的方法是创建两个实用方法,一个用于启用“加载”指示器,另一个用于禁用加载状态

在所有初始ajax调用(或任何其他长调用)后,自动调用enable方法


一旦启动了oncomplete回调,就从oncomplete回调调用disable方法。

如果您的程序没有响应,那是因为您正在对UI线程进行实际工作。将工作移动到后台线程,根据需要禁用UI交互以防止用户在工作时触摸内容,然后在后台工作完成后,使用控件将结果传递回UI线程。调用,然后使用结果更新UI,然后重新启用所有内容

为了实现微调器,我使用了一个带有微调器gif的PictureBox。我在UI空闲时禁用它,在启动后台工作程序时启用它


另一种方法是将鼠标光标改为“等待”光标,我不太喜欢它。

我可以添加这个代码项目吗

您只需构建、从工具栏拖动并使用。
LoadingCircle
组件工作正常。就像一个魅力,你甚至可以定制它

处理前: Cursor.Current=Cursors.WaitCursor

ProcessSomething()

处理后:
Cursor.Current=Cursors.AppStarting

我正在使用Visual Studio Enterprise 2015。这里给出的建议光标样式/类型,没有一个适合我

与我一起工作的人是:

private async void button_Click(object sender, RoutedEventArgs e)
{
    Cursor = Cursors.Wait; // change cursor to hourglass type
    ThatProcessThatTookVeryLongTime();
    Cursor = Cursors.Arrow; // change cursor to normal type
}

这是我在需要等待光标时喜欢使用的方式;而不是编写try finally代码

    #region WaitCursor
    public static IDisposable BeginWaitCursorBlock()
    {
        return ((!_waitCursorIsActive) ? (IDisposable)new waitCursor() : null);
    }
    private static bool _waitCursorIsActive;
    private class waitCursor : IDisposable
    {
        private Cursor oldCur;
        public waitCursor()
        {
            _waitCursorIsActive = true;
            oldCur = Cursor.Current;
            Cursor.Current = Cursors.WaitCursor;
        }
        public void Dispose()
        {
            Cursor.Current = oldCur;
            _waitCursorIsActive = false;
        }
    }
    #endregion
示例用法:

using (BeginWaitCursorBlock())
{
  ...
}
自.NET 4.5(VS 2015+)以来,您可以结合使用async和Wait with Progress向UI线程发送更新:


另一种方法是后台工作人员或线程在运行动画时执行此工作,等待光标或/并在窗体/主线程中显示加载程序GIF。

我希望它是一个图像…有什么建议吗?嗯,您可以显示动画,但如果GUI线程被阻止,它将不会更新(鼠标光标由Windows处理,因此GUI是否阻塞并不重要)。因此,无论你做什么,你都需要在一个单独的线程中完成工作。这是一个很好的Q/a。你也可以使用该属性。太好了!太不经意了!谢谢!对于动画图像,你可以使用此控制器。我已经开始使用它,并取得了巨大的成功!@koray当我尝试在我的一个
WPF
项目中使用你的解决方案时,我得到了错误:1.在oldCur=Cursor.Current;:
行中,Cursor不包含Current的定义。
行中,Cursor.Current=Cursors.WaitCursor;:
Cursors不包含WaitCursor的定义。
。请告知。