2016-02-02 7 views
5

Ich verwende Xamarin Forms Picker Control und muss die Textfarbe festlegen, es gibt jedoch keine solche Eigenschaft. Ich habe versucht, einen benutzerdefinierten Renderer zu machen, der für mich in android und ios ausgearbeitet hat (ich habe das Steuerelement neu gezeichnet). In der wp8.1-Plattform gibt es kein Draw-Ereignis, und das Steuerelement selbst im Renderer scheint nicht über die Eigenschaften zum Festlegen der Textfarbe zu verfügen. Ich habe auch versucht, die Kontrolle zu ändern, die der Pflücker erfolglos bindet.Ändern der Standardtextfarbe eines Picker-Steuerelements in Xamarin Forms für Windows Phone 8.1

Derzeit habe ich die bindbare Eigenschaft TextColor in der PCL erstellt, die funktioniert. Der Code für meinen Renderer ist unten gezeigt (ich habe meinen gesamten Testcode entfernt und stelle nur den Basiscode her, da ich noch nichts Nützliches gefunden habe und meinen Code einfüge, um alle im Kontext zu halten). Beachten Sie auch, dass die Eigenschaft Picker.TextColorProperty muß nicht existieren, und ist das, was ich tun möchte ...

using Namespace.CustomControls; 
using Namespace.WinPhone.Renderers; 
using Xamarin.Forms; 
using Xamarin.Forms.Platform.WinPhone; 

[assembly: ExportRendererAttribute(typeof(BindablePicker), typeof(BindablePickerRenderer))] 
namespace Namspace.WinPhone.Renderers 
{ 
    public class BindablePickerRenderer : PickerRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<Picker> e) 
     { 
      base.OnElementChanged(e); 

      var picker = e.NewElement; 
      BindablePicker bp = (BindablePicker)this.Element; 

      if (this.Control != null) 
      { 
       var pickerStyle = new Style(typeof(Picker)) 
       { 
        Setters = { 
         new Setter {Property = Picker.BackgroundColorProperty, Value = bp.BackgroundColor}, 
         new Setter {Property = Picker.TextColorProperty, Value = bp.TextColor} 
        } 
       }; 

       picker.Style = pickerStyle; 
      } 
     } 
    } 
} 

Wie auch immer ich frage mich, wenn jemand könnte ein wenig mehr Wissen darüber, wie dies zu tun und Schuppen könnte etwas Licht auf mich.

Antwort

7

Es gibt keine TextColor Eigenschaft in der Picker wie Sie erwähnen.

Auch wenn dies der Fall ist, können wir immer noch die Picker Textfarbe für WindowsPhone ändern.

Ich nehme an, Sie von PickerRenderer erben, wie es aus dem Code Beispiel fehlte, und ich habe ein paar zusätzlichen Dinge hinzugefügt, so diese anderen hilfreicher ist: -

die Schnittstelle in den PCL definieren: -

public interface ICustomPicker2 
{ 
    Xamarin.Forms.Color MyBackgroundColor { get; set; } 
    Xamarin.Forms.Color MyTextColor { get; set; } 
} 

Erweitere Xamarin.FormsPicker im PCL: -

public class CustomPicker2 
    : Xamarin.Forms.Picker 
    , ICustomPicker2 
{ 

    public static readonly BindableProperty MyBackgroundColorProperty = BindableProperty.Create<CustomPicker2, Xamarin.Forms.Color>(p => p.MyBackgroundColor, default(Xamarin.Forms.Color)); 

    public static readonly BindableProperty MyTextColorProperty = BindableProperty.Create<CustomPicker2, Xamarin.Forms.Color>(p => p.MyTextColor, default(Xamarin.Forms.Color)); 

    public Xamarin.Forms.Color MyTextColor 
    { 
     get { return (Xamarin.Forms.Color)GetValue(MyTextColorProperty); } 
     set { SetValue(MyTextColorProperty, value); } 
    } 

    public Xamarin.Forms.Color MyBackgroundColor 
    { 
     get { return (Xamarin.Forms.Color)GetValue(MyBackgroundColorProperty); } 
     set { SetValue(MyBackgroundColorProperty, value); } 
    } 
} 

Erstellen Sie Ihren WindowsPhone Renderer wie so in einer Klassenbibliothek: -

public class CustomPicker2Renderer 
    : PickerRenderer 
{ 

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

     var picker = e.NewElement; 
     CustomPicker2 bp = (CustomPicker2)this.Element; 

     if (this.Control != null) 
     { 
      var pickerStyle = new Style(typeof(Picker)) 
      { 
       Setters = { 
        new Setter {Property = Picker.BackgroundColorProperty, Value = bp.MyBackgroundColor}, 
       } 
      }; 

      SetPickerTextColor(bp.MyTextColor); 

      picker.Style = pickerStyle; 
     }  
    } 

    private void SetPickerTextColor(Xamarin.Forms.Color pobjColor) 
    { 
     byte bytR = (byte)(pobjColor.R * 255); 
     byte bytG = (byte)(pobjColor.G * 255); 
     byte bytB = (byte)(pobjColor.B * 255); 
     byte bytA = (byte)(pobjColor.A * 255); 
     // 
     ((System.Windows.Controls.Control)(((System.Windows.Controls.Panel)this.Control).Children[0])).Foreground = new SolidColorBrush(System.Windows.Media.Color.FromArgb(bytA, bytR, bytG, bytB)); 
    } 

Hinweis ist das vor allem, was Sie brauchen, wenn Sie nur die einmal die Textfarbe einstellen möchten.

Allerdings, wenn Sie die Farbe ändern möchten, nachdem es anfänglich eingestellt wurde, dann müssen Sie auf die Eigenschaftsänderung und wirken auf sie wie im folgenden hören: -

protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     base.OnElementPropertyChanged(sender, e); 
     // 
     if (e.PropertyName == "MyTextColor") 
     { 
      SetPickerTextColor((this.Element as CustomPicker2).MyTextColor); 
     } 
    } 

Sie auch benötigen als auch den Renderer aus der Klassenbibliothek exportieren: -

[assembly: ExportRendererAttribute(typeof(CustomPicker2), typeof(CustomPicker2Renderer))] 
+0

Dank, die perfekt funktioniert! Ich habe den Code korrigiert und die Klassendeklaration mit der PickerRenderer-Vererbung hinzugefügt (erscheint versehentlich überschrieben), falls jemand auf diese Frage stolpert. –

+0

Das ist großartig (+1), aber eine Sache - warum verwenden Sie einen Stil, um die Hintergrundfarbe zu überschreiben? Das heißt, Sie überschreiben auch alle anderen Stile, die sich möglicherweise auf dem Xamarin-Element befinden. Stattdessen sollten Sie nur die einzelne Hintergrundfarbe-Eigenschaft festlegen. – jbyrd