根据@SushiHangover的回答,我们可以做一个ViewRenderer
来达到你的效果。
首先,创建我们自己的ProgressView
,确保它继承自ContentView
。还添加一个BindableProperty
呈现价值:
public partial class ProgressView : ContentView
{
public double Progress
{
set { SetValue(ProgressProperty, value); }
get { return (double)GetValue(ProgressProperty); }
}
public readonly static BindableProperty ProgressProperty = BindableProperty.Create("Progress", typeof(double), typeof(ProgressView), 0.0);
...
}
然后,我们可以制作自定义渲染器,如下所示:
protected override void OnElementChanged(ElementChangedEventArgs<View> e)
{
base.OnElementChanged(e);
//You can refer to @SushiHangover's method for detail's code, here I use the same name.
Setup();
Complete = ((ProgressView)Element).Progress;
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == "Progress")
{
Complete = ((ProgressView)Element).Progress;
}
}
因为这是在渲染器中,所以我们应该刷新标签的框架:
public override void Draw(CGRect rect)
{
base.Draw(rect);
...
label.Frame = Bounds;
}
最后我们可以在表单上使用它,例如:
<local:ProgressView x:Name="MyProgress" HeightRequest="50"/>