2017-06-20 59 views
1

我做了一个进度条定制(自定义渲染)更改iOS和Droid的进度条颜色在PCL以下自定义使用Xamarin在UWP进度条颜色表格

自定义进度条类看出:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Xamarin.Forms; 

namespace App2 
{ 
    public class ColorProgressBar : ProgressBar 
    { 
     public static BindableProperty BarColorProperty 
      = BindableProperty.Create<ColorProgressBar, Color>(p => 
        p.BarColor, default(Color)); 

     public Color BarColor 
      { 
      get { return (Color)GetValue(BarColorProperty); } 
      set { SetValue(BarColorProperty, value); } 
      } 
    } 
    } 

为iOS定制渲染:

using App2; 
using App2.iOS; 
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Text; 
using Xamarin.Forms; 

//using MonoTouch.Foundation; 
//using MonoTouch.UIKit; 
using Xamarin.Forms.Platform.iOS; 

[assembly: ExportRenderer(typeof(ColorProgressBar), 
typeof(ColorProgressBarRenderer))] 

namespace App2.iOS 
{ 
    public class ColorProgressBarRenderer : ProgressBarRenderer 
    { 
     public ColorProgressBarRenderer() 
     { } 

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

     if (e.NewElement == null) 
      return; 

     if (Control != null) 
     { 
      UpdateBarColor(); 
     } 
     } 

     protected override void OnElementPropertyChanged(object sender, 
     PropertyChangedEventArgs e) 
     { 
      base.OnElementPropertyChanged(sender, e); 

      if (e.PropertyName == 
       ColorProgressBar.BarColorProperty.PropertyName) 
      { 
      UpdateBarColor(); 
      } 
     } 
     private void UpdateBarColor() 
     { 
      var element = Element as ColorProgressBar; 
      Control.TintColor = element.BarColor.ToUIColor(); 
     } 
     } 
    } 

为Android定制渲染:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Android.App; 
using Android.Content; 
using Android.OS; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using Android.Renderscripts; 
using static Java.Util.ResourceBundle; 
using Xamarin.Forms.Platform.Android; 
using Android.Graphics; 
using System.ComponentModel; 
using Xamarin.Forms; 
using App2; 
using App2.Droid; 

[assembly: ExportRenderer(typeof(ColorProgressBar), 
         typeof(ColorProgressBarRenderer))] 
namespace App2.Droid 
{ 
    public class ColorProgressBarRenderer : ProgressBarRenderer 
    { 
     public ColorProgressBarRenderer() 
     { } 

     protected override void 
     OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.ProgressBar> 
          e) 
       { 
        base.OnElementChanged(e); 

        if (e.NewElement == null) 
         return; 

        if (Control != null) 
        { 
         UpdateBarColor(); 
        } 
       } 

     protected override void OnElementPropertyChanged(object sender, 
     PropertyChangedEventArgs e) 
       { 
       base.OnElementPropertyChanged(sender, e); 

       if (e.PropertyName == 
         ColorProgressBar.BarColorProperty.PropertyName) 
        { 
         UpdateBarColor(); 
        } 
       } 

     private void UpdateBarColor() 
       { 
       var element = Element as ColorProgressBar; 
       // http://stackoverflow.com/a/29199280 
       Control.IndeterminateDrawable.SetColorFilter( 
       element.BarColor.ToAndroid(), PorterDuff.Mode.SrcIn); 
       Control.ProgressDrawable.SetColorFilter( 
       element.BarColor.ToAndroid(), PorterDuff.Mode.SrcIn); 
       } 
    } 
} 

我设置自定义进度条的颜色是这样的:

var progressBar = new ColorProgressBar(); 
progressBar.BarColor = Color.Red; 

我不明白如何使一个自定义渲染类UWP改变进度条的颜色。有人能帮助我理解如何做这个班吗?

回答

1

您将要更新本机Windows.UI.Xaml.Controls.ProgressBar控件的Foreground属性以更改颜色。

它应该是这个样子:

private void UpdateBarColor() 
{ 
    var element = Element as ColorProgressBar; 
    Control.Foreground = new Windows.UI.Xaml.Media.SolidColorBrush(
     GetWindowsColor(element.BarColor)); 
} 

Windows.UI.Color GetWindowsColor(Color color) 
{ 
    return Windows.UI.Color.FromArgb((byte)(255 * color.A), (byte)(255 * color.R), (byte)(255 * color.G), (byte)(255 * color.B)); 
} 

这将带你BarColor,用它来做出正确颜色的SolidColorBrush,然后分配,为您的本地ProgressBar控制。

+0

它适用于Windows Phone非常感谢你(^_^) – paula

+0

@paula没问题!如果回答您的问题,请务必将此解决方案标记为答案。 –