【问题标题】:Customizing a Progress Bar appearance in Xamarin.Forms在 Xamarin.Forms 中自定义进度条外观
【发布时间】:2018-07-20 02:15:57
【问题描述】:

我使用Drawable 自定义AndroidProgressBar 的呈现,如this question 的回答,但该解决方案不适用于iOS。

下面是它在Android 中的呈现方式。

下面是它在iOS 中的呈现方式

下面是我的iOSCustomRenderer的代码

[assembly: ExportRenderer(typeof(CustomProgressbar), typeof(CustomProgressBarRenderer))]
namespace Demo.iOS.Renderers
{
public class CustomProgressBarRenderer : ProgressBarRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<ProgressBar> e)
    {
        try
        {
            base.OnElementChanged(e);

            if (Control != null)
            {                
               Control.ProgressTintColor = Color.FromHex("#ff0000").ToUIColor();                       
               Control.TrackTintColor = Color.FromHex("#3489cc").ToUIColor();
             } 
        }
        catch (Exception ex)
        {

        }
    }

    public override void LayoutSubviews()
    {
        base.LayoutSubviews();
        var X = 1.0f;
        var Y = 15.0f;
        CGAffineTransform _transform = CGAffineTransform.MakeScale(X, Y);
        this.Transform = _transform;
        this.ClipsToBounds = true;
        this.Layer.MasksToBounds = true;
        this.Layer.CornerRadius = 5;
    }
}

}

我该如何做到这一点?

【问题讨论】:

  • Xamarin.Forms 是跨平台的,适用于 Android 的也应该适用于 iOS。到目前为止,您尝试了什么,遇到了什么错误?
  • 你引用的问题说:> 我可以在 iOS 中使用自定义渲染器来做到这一点
  • @MuhammadKhan 是的,我遵循了问题中提到的代码,但它与输出不匹配。让我添加一张来自iOS的截图。
  • @MuhammadKhan 请查看编辑
  • 嗨@LibinTK,你的问题解决了吗?

标签: c# ios xamarin xamarin.forms


【解决方案1】:

根据@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"/>

【讨论】:

猜你喜欢
  • 2012-04-08
  • 1970-01-01
  • 2012-07-15
  • 2014-01-29
  • 2016-05-06
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多