2017-06-20 5 views
1

ich einen Fortschrittsbalken Anpassung (benutzerdefinierte Renderer) gab die Statusleiste Farbe in iOS und Droid wie in der folgendendie Fortschrittsbalken Farbe in UWP Customizing Xamarin mit Forms

Benutzerdefinierte Fortschrittsbalken-Klasse im PCL gesehen zu ändern:

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); } 
      } 
    } 
    } 

Individuelle Renderer für 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(); 
     } 
     } 
    } 

Individuelle Renderer für 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); 
       } 
    } 
} 

Ich gründe die individuellen Fortschrittsbalken der Farbe auf diese Weise:

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

Ich verstehe nicht, wie eine benutzerdefinierte Renderer Klasse für UWP zu machen, die die Farbe des Fortschrittsbalkens ändern. Könnte mir bitte jemand helfen, zu verstehen, wie man diesen Kurs macht?

Antwort

1

Sie werden die Foreground Eigenschaft des systemeigenen Steuerelements aktualisieren, um die Farbe zu ändern.

Es sollte wie folgt aussehen:

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)); 
} 

Diese nehmen Ihre BarColor, es verwenden, um eine SolidColorBrush der richtigen Farbe zu machen, und dann die Kontrolle Ihrer Mutter ProgressBar zuweisen.

+0

es funktioniert für Windows-Telefon vielen Dank (^_^) – paula

+0

@paula Kein Problem! Achten Sie darauf, diese Lösung als Antwort zu markieren, wenn sie Ihre Frage beantwortet hat. –

Verwandte Themen