如何使用具有动态时间的ProgressRing xamarin表单显示计时器

时间:2018-06-04 11:16:02

标签: xamarin.forms

我使用display a timer using progressBar xamarin forms引用的代码实现了时间进度响铃。

现在我想动态绑定总时间的值,以便当时间达到某个固定值时,进度环开始进行。我怎么能做到这一点?

1 个答案:

答案 0 :(得分:0)

由于ConverterParameter不是可绑定属性,因此我们无法使用Binding。但我们可以尝试使用可绑定属性自定义此标签,并将自身传递给ConverterParameter

自定义此标签,如:

public class MyLabel : Label
{
    public double TotalTime
    {
        set { SetValue(TotalTimeProperty, value); }
        get { return (double)GetValue(TotalTimeProperty); }
    }
    public static readonly BindableProperty TotalTimeProperty = BindableProperty.Create(nameof(TotalTime), typeof(double), typeof(MyLabel), default(double));
}

然后我们可以在XAML中传递自己:

<local:MyLabel x:Name="MyLabel" 
                TotalTime="{Binding TotalTime}"
                Text="{Binding Source={x:Reference progressBar}, Path=Progress, Converter={StaticResource countDownTime}, ConverterParameter={x:Reference MyLabel}"
                HorizontalOptions ="Center"
                FontSize="20"
                FontFamily = "Helvetica Neue"
                TextColor = "Red" />

最后在后面的代码中修改此TotalTime

public class BindModel : INotifyPropertyChanged
{
    double totalTime;
    public double TotalTime
    {
        set
        {
            totalTime = value;
            onPropertyChanged("TotalTime");
        }
        get
        {
            return totalTime;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    void onPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
// And set this model as a BindingContext 
var model = new BindModel { TotalTime = 60000 };
BindingContext = model;

您的IValueConverter也应如下所示:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    double time = 0;
    double myTotalTime = ((MyLabel)parameter).TotalTime;
    double.TryParse(myTotalTime.ToString(), out var totalTime);
    double.TryParse(value.ToString(), out var progress);
    time = progress <= double.Epsilon ? totalTime : (totalTime - (totalTime * progress));
    var timeSpan = TimeSpan.FromMilliseconds(time);
    return $"{timeSpan.Minutes:00;00}:{timeSpan.Seconds:00;00}";
}