如何在计算过程中显示Silverlight Toolkit忙指示器?

3

我在实现一个显示忙碌指示器的控件时遇到了一些问题,以下是情景:我有一个简单的视图,其中包含一个忙碌指示器和一个文本块,它们绑定到一个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;
}

现在发生了一些不同的事情,繁忙指示器加载得很好,但是当计算时间太短时,繁忙指示器不会显示,并且在调用CallMe()方法和文本出现在屏幕上之间存在小延迟。这是我的问题,我希望在繁忙指示器隐藏之前计算Text属性(并在屏幕上显示)。 有人知道一个好的方法来做到这一点吗?或者有任何建议我可以遵循吗?

1
请确认一下:在您的忙指示器控件上,您已经设置了以下内容吗?DisplayAfter="0" - emp
我简直不敢相信我错过了那个,谢谢,这解决了我的问题 :) - Ariel
@emp:尽管答案很简短,但它仍然是一个答案。请使用答案框添加答案,而不是使用评论。这将使问题出现在问题列表中,显示为已有答案并且可能已标记为已回答,从而节省其他人阅读问题以寻求答案的时间和麻烦,只需发现实际上已经解决了。 - AnthonyWJones
2个回答

1

busyindicator控件需要

DisplayAfter="0"

1

我也遇到了类似的问题,有时候忙碌指示器会一直显示,看起来通过将DisplayAfter设置为“0”可以解决这个问题。

步骤1:显示忙碌指示器,然后调用JavaScript函数:

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

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

BusyIndicator.IsBusy = false;

问题:JavaScript函数调用Silverlight函数在UI上真正显示忙指示器之前关闭忙指示器(尽管我们在调用JavaScript之前已将IsBusy设置为true)。
解决方案:我观察到xaml中DisplayAfter的值设置为00.00.00.1,我已经进行了更改。
BusyIndicator.DisplayAfter = TimeSpan.Zero

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

感谢您的输入


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接