3

我在实现一个显示忙碌指示器的控件时遇到了一些问题,这里是场景:我有一个带有忙碌指示器和 TextBlock 的简单视图,它绑定到一个 ViewModel(类似于以下内容)。

public class ViewModel
{
    private bool _isbusy;
    public bool IsBusy
    {
        get { return _isbusy; }
        set
        {
            _isbusy=value;
            OnPropertyChanged("IsBusy");
        }
    }

    private string _text;
    public string Text
    {
        get { return _text; }
        set
        {
            _text = value;
            OnPropertyChanged("Text");
        }
    }

    public void CallMe()
    {
        IsBusy = true;
        Text = Static.PerformCalculation();
        IsBusy = false;
    }
}

到目前为止一切都很简单,不是吗?问题是当我有像 CallMe() 这样的方法时。我必须在计算完成时显示和隐藏繁忙指示器,我认为原因是计算和 IsBusy 属性通知在同一个线程上完成,所以我得出了这样的结果:

public void CallMe()
{
    IsBusy = true;
    Static.PerformCalculationAsync(CalculationCallback);
}

private void CalculationCallback(string result)
{
    Text = result;
    IsBusy = false;
}

现在发生了一些不同的事情,Busy Indicator 加载正常,但是当计算太短时 BusyIndi​​cator 不显示,并且在调用 CallMe() 方法和 Text 出现在屏幕上之间有一个小的延迟。这是我的问题,我希望在 BusyIndi​​cator 隐藏之前计算 Text 属性(并显示在屏幕上)。

有谁知道这样做的好方法,或者有什么我可以遵循的建议?

4

2 回答 2

1

控制busyindicator需求

DisplayAfter="0"
于 2011-07-18T14:51:43.223 回答
1

我也遇到了类似的问题,有时会永远显示繁忙的指示器,并且看起来问题已通过设置DisplayAfter为“0”得到解决。

步骤 1.显示忙碌指示符,然后调用 javascript 函数:

BusyIndicator.IsBusy = true;
HtmlPage.Window.Invoke("foo", id);  

步骤 2. Javascript 函数进行回发,一旦回发完成,它调用 Silverlight 函数通过设置关闭忙碌指示器:

BusyIndicator.IsBusy = false;

问题: javascript函数调用silverlight函数来关闭busy指示器,然后busy指示器才真正显示在UI上(尽管我们IsBusy在调用javascript之前已经设置为true)。

解决方案:我观察到该DisplayAfter00.00.00.1在 xaml 中设置为,我已更改为

BusyIndicator.DisplayAfter = TimeSpan.Zero

在后面的代码中。这解决了我的问题。但我想检查HtmlPage.Window.Invoke是同步调用还是异步调用?

感谢您的投入

于 2011-12-09T08:37:29.990 回答