延迟windows phone 8进度条外观

时间:2014-02-14 09:23:49

标签: c# silverlight windows-phone-8 windows-phone

我想延迟Windows Phone 8应用程序中进度条的出现2秒 因此,当我在2秒后没有收到响应时,如果我调用webservice,则应显示进度条。

我已使用 DispatcherTimer 实现了代码,但它没有按预期工作的接缝。
此变量绑定到ProgressBar控件的 IsEnabled IsVisible 。 问题是这个代码是随机工作而不是2秒后。当我将计时器增加20秒时,即使每个响应都低于1秒,仍然会出现进度条。

 private bool _isProgressBarLoading;
    public bool IsProgressBarLoading
    {
        get
        {
            return _isProgressBarLoading;
        }
        set
        {
            if (_isProgressBarLoading != value)
            {
                if (value)
                {
                    var timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(2000) };
                    timer.Tick += delegate
                    {
                        timer.Stop();
                        _isProgressBarLoading = true;
                    };
                    timer.Start();
                }
                else
                {
                    _isProgressBarLoading = false;
                }
                NotifyOfPropertyChange(() => IsProgressBarLoading);
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

如何在单独的线程上使用different Timer

System.Threading.Timer myTimer = null;
private bool _isProgressBarLoading = false;
public bool IsProgressBarLoading
{
    get { return _isProgressBarLoading; }
    set
    {
       if (_isProgressBarLoading != value)
       {
           if (value)
           {
                if (myTimer == null)
                {
                   myTimer = new System.Threading.Timer(Callback, null, 3000, Timeout.Infinite);
                }
                else myTimer.Change(3000, Timeout.Infinite);
                // it should also work if you create new timer every time, but I think it's
                // more suitable to use one
           }
           else
           {
                _isProgressBarLoading = false;
                NotifyOfPropertyChange(() => IsProgressBarLoading);
           }
       }
    }
}

private void Callback(object state)
{
   Deployment.Current.Dispatcher.BeginInvoke(() =>
   {
       _isProgressBarLoading = true;
        NotifyOfPropertyChange(() => IsProgressBarLoading);
    });
}

DispatcherTimer正在使用主线程,我认为使用其他线程会更好。


至于你的代码,它应该工作如果看起来像这样 - 当你改变值时通知:

if (value)
{
    var timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(2000) };
    timer.Tick += delegate
    {
        timer.Stop();
        _isProgressBarLoading = true;
        NotifyOfPropertyChange(() => IsProgressBarLoading);
    };
    timer.Start();
}
else
{
    _isProgressBarLoading = false;
    NotifyOfPropertyChange(() => IsProgressBarLoading);
}