2017-06-20 101 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沒問題!如果回答您的問題,請務必將此解決方案標記爲答案。 –