【问题标题】:Xamarin Custom Progressbar renderer problemXamarin 自定义 Progressbar 渲染器问题
【发布时间】:2021-04-04 03:09:27
【问题描述】:

我创建了一个新的自定义渲染器,它似乎可以工作,但是当我向上或向下滚动时,设置会发生一些奇怪的事情。正如您在照片中看到的,ProgressBar 的大小发生了变化。

它只发生在 iOS 上。在 Android 上一切都很好。 也许有人可以帮忙?

using System;
using Xamarin.Forms.Platform.iOS;
using Xamarin.Forms;
using ExpensesApp.iOS.CustomRenderers;
using CoreGraphics;
using CoreAnimation;
using UIKit;
using System.ComponentModel;
using System.Threading.Tasks;

[assembly: ExportRenderer(typeof(ProgressBar),typeof(CustomProgressBarRenderer))]
namespace ExpensesApp.iOS.CustomRenderers
{
public class CustomProgressBarRenderer : ProgressBarRenderer
{
    public CustomProgressBarRenderer()
    {
        this.ElementChanged += CustomProgressBarRenderer_ElementChanged;
    }

    private void CustomProgressBarRenderer_ElementChanged(object sender, 
    ElementChangedEventArgs<ProgressBar> e)
    {
        setColor(e.NewElement);
    }

    protected override void OnElementChanged(ElementChangedEventArgs<ProgressBar> e)
    {
        base.OnElementChanged(e);
        LayoutSubviews();
    }

    public override void LayoutSubviews()
    {
        base.LayoutSubviews();
        float x = 1.0f;
        float y = 4.0f;
        CGAffineTransform transform = CGAffineTransform.MakeScale(x, y);
        Transform = transform;
    }

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);
        if (e.PropertyName == "Progress")
        {
            setColor(sender as ProgressBar);
        }
    }

    void setColor(ProgressBar element)
    {
        try
        {
            if (element != null)
            {
                var progress = element.Progress * 100;
                if (progress <= 20)
                {
                    this.TintColor = UIColor.Green;
                }
                else if (progress > 20 && progress <= 50)
                {
                    this.TintColor = UIColor.Yellow;
                }
                else if (progress > 50 && progress <= 80)
                {
                    this.TintColor = UIColor.Orange;
                }
                else
                {
                    this.TintColor = UIColor.Red;
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
        }
    }
}
}

【问题讨论】:

    标签: c# xamarin xamarin.forms renderer custom-renderer


    【解决方案1】:

    将变换设置为控制:

    public override void LayoutSubviews()
    {
        base.LayoutSubviews();
        float x = 1.0f;
        float y = 4.0f;
        CGAffineTransform transform = CGAffineTransform.MakeScale(x, y);
        Control.Transform = transform;
    }
    

    并且不要在OnElementChanged中调用LayoutSubviews();

    protected override void OnElementChanged(ElementChangedEventArgs<ProgressBar> e)
    {
        base.OnElementChanged(e);
        //LayoutSubviews();
    }
    

    【讨论】:

      【解决方案2】:

      谢谢。我试过但没有帮助。我找到了另一个解决方案。 我不知道这是怎么回事。但它按我想要的方式工作。我还在学习:)

       public CustomProgressBarRenderer()
          {
              this.ElementChanged += CustomProgressBarRenderer_ElementChanged;
          }
      
          private void CustomProgressBarRenderer_ElementChanged(object sender, ElementChangedEventArgs<ProgressBar> e)
          {
              if (e.NewElement != null)
              {
                  e.NewElement.ScaleY = 4;
              }
          }
      

      【讨论】:

      • 你可以标记这个答案(点击这个答案左上角的☑️),这将帮助更多有同样问题的人:)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      • 2018-07-29
      • 1970-01-01
      • 2016-09-03
      • 2019-01-14
      相关资源
      最近更新 更多