簡體   English   中英

Xamarin 自定義進度條渲染器問題

[英]Xamarin Custom Progressbar renderer problem

我創建了一個似乎可以工作的新自定義渲染器,但是當我向上或向下滾動時,設置會發生一些奇怪的事情。 正如您在照片中看到的那樣, 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);
        }
    }
}
}

在此處輸入圖像描述

在此處輸入圖像描述

將變換設置為控件:

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

並且不要調用LayoutSubviews(); OnElementChanged中:

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

謝謝你。 我試過了,但沒有用。 我找到了另一個解決方案。 我不知道這是怎么回事。 但它按照我想要的方式工作。 我還在學習:)

 public CustomProgressBarRenderer()
    {
        this.ElementChanged += CustomProgressBarRenderer_ElementChanged;
    }

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM