【问题标题】:How to display Busy cursor for x number of time then a splash screen?如何显示忙碌光标x次然后启动屏幕?
【发布时间】:2018-07-30 14:13:52
【问题描述】:

我在 WPF 中使用 C#.net 应用程序,其中我们有很多昂贵的操作。最近我们有这个要求:对于长时间运行的进程,显示忙碌光标直到 3 秒,如果操作超过 3 秒,则显示启动屏幕,直到操作完成。我在网上搜索了很多,但似乎没有什么相关的。任何支持将不胜感激。

我们已经尝试了一些方法,它可以工作,但在少数情况下它没有给出预期的结果。任何帮助将不胜感激。 当我的内部逻辑显示任何警报消息并等待用户输入时,忙碌光标功能计时器继续运行,我们也得到了启动。

    public class BusyCursor:IDisposable
    {
        private Cursor _previousCursor;
        System.Timers.Timer _timer     
        public BusyCursor()
        {
            _previousCursor = Mouse.OverrideCursor;
            Mouse.OverrideCursor = Cursors.Wait;
           _timer = new System.Timers.Timer(); 
           _timer.Interval = 3000;
           _timer.Elapsed += timer_Tick;
           _timer.Start();
        }
        public void timer_Tick(object sender, ElapsedEventArgs e)
        {           
            Application.Current.Dispatcher.Invoke((new Action(() =>
                {
                    if (!DXSplashScreen.IsActive)
                    {
                        DXSplashScreen.Show<TrippsSplashScreen>();
                    }
                    Mouse.OverrideCursor = Cursors.Arrow;
                    _timer.Stop();

                })), DispatcherPriority.ApplicationIdle);            

        }
        #region IDisposable Members
        public void Dispose()
        {            
                _timer.Stop();
                if (DXSplashScreen.IsActive)
                {
                    DXSplashScreen.Close();
                }
                Mouse.OverrideCursor = Cursors.Arrow;               
        }
        #endregion
    }

Usage:

using (new BusyCursor())
{
       //logic ---
}

谢谢

【问题讨论】:

  • 在过去的 20 多年里,相关文章已有数 千篇。这在 VB6、Winforms 和 WPF 教程中有描述。 Async in 4.5: Enabling Progress and Cancellation in Async APIs 展示了自 .NET 4.5 以来如何执行此操作。在 VB6 和 .NET 3.5 之前,您需要 BackgroundWorker 来完成类似的操作
  • 在 WPF 中您不需要也不应该直接修改 UI。将您的 UI 绑定到模型,例如 ProgressModel。您可以将不同的视图绑定到同一个模型,甚至在运行时更改视图,例如,仅在开始时将光标更改为 Cursor.Wait 并将其Progress 属性绑定到状态进度条的视图。如果一个事件在 3 秒后到达,它可以使用除了状态进度条之外的对话框视图

标签: c# wpf splash-screen busy-cursor


【解决方案1】:
bool calculating = false;
bool showingSplash = false;
void Meth(Task[] expensiveCalls)
{
    Task.Factory.StartNew(() =>
    {
        calculating = true;
        Task.Factory.StartNew(() =>
        {
            Task.Delay(3000).Wait();
            if (calculating)
            {
                showingSplash = true;
                //Application.Current.Dispatcher.Invoke(() => show_sphlash());
            }
        });
        Task.WaitAll(expensiveCalls);
        calculating = false;
        if (showingSplash)
        {
            //Application.Current.Dispatcher.Invoke(() => hide_sphlash());
            showingSplash = false;
        }
    }
    );
}

【讨论】:

  • 感谢您的回复。
  • 它对你有用吗?如果是,那么您可以接受答案。
  • 感谢您的大力支持。这会起作用,但我正在寻找一些通用的自定义函数,我可以在所有昂贵的操作中调用它。如果我采用上述方法,我必须在每个昂贵的操作中复制相同的代码,并且我有大量昂贵的操作。
  • 感谢 Rekshino,在修改后的代码 sn-p 中,您将任务列表传递给方法,如果我们采用这种方法,我们必须首先生成任务并将任务传递给此方法,这又是重大的代码更改。我们正在寻找的是我们在长时间运行的函数中生成对通用自定义方法的调用,它显示忙碌光标 3 秒,如果操作花费超过 3 秒,则会出现启动屏幕。操作完成后,飞溅应该会自动消失。
  • 我已经用我们正在尝试的方法更新了这个问题。任何帮助将不胜感激。
猜你喜欢
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 2013-03-13
  • 2012-05-16
  • 1970-01-01
相关资源
最近更新 更多