2016-02-02 29 views
5

Uso il controllo selettore Form Xamarin e richiede l'impostazione del colore del testo, tuttavia non esiste tale proprietà. Ho provato a creare un renderer personalizzato che ha funzionato per me in Android e iOS (ho finito per ridisegnare il controllo). Nella piattaforma wp8.1 non vi è alcun evento Draw e il controllo stesso nel renderer non sembra avere le proprietà per impostare il colore del testo. Ho anche provato a cambiare il controllo che il raccoglitore si lega a invano.Modifica del colore del testo predefinito di un controllo Picker in Xamarin Forms per Windows Phone 8.1

Attualmente ho creato la proprietà bindable TextColor nel PCL che funziona. Il codice per il mio renderer è mostrato sotto (ho spogliato tutto il mio codice di test e sto mettendo solo il codice di base poiché non ho ancora trovato nulla di utile e sto mettendo il mio codice solo per mantenere tutti nel contesto). noti inoltre che il Picker.TextColorProperty proprietà doesnt esisto ed è quello che vorrei fare ...

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

Comunque mi chiedo se qualcuno potrebbe avere un po 'più di conoscenza su come fare questo e potrebbe gettare un po 'di luce su di me.

risposta

7

Non c'è la proprietà TextColor disponibile nello Picker come si parla.

Anche in questo caso, possiamo ancora ottenere la modifica del colore del testo Picker per WindowsPhone.

sto supponendo che si eredita da PickerRenderer come è stato manca dal tuo esempio di codice e ho aggiunto alcune cose in più in modo da questo è più utile agli altri: -

definire l'interfaccia nel PCL: -

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

Estendere il Xamarin.FormsPicker nella 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); } 
    } 
} 

Creare la WindowsPhone renderer in questo modo in una libreria di classi: -

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

nota, quanto sopra è tutto quello che vi serve se si desidera solo per impostare il colore del testo una volta.

Tuttavia, se si desidera cambiare il colore dopo che è stato inizialmente impostato, allora si avrà bisogno di ascoltare il cambiamento di proprietà e agire su di essa come di seguito: -

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

Sarà inoltre necessario per esportare il renderer dalla libreria di classi: -

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

Grazie a quello ha funzionato perfettamente! Ho corretto il codice e aggiunto la dichiarazione di classe con l'ereditarietà di PickerRenderer (sembra che l'ho sovrascritta accidentalmente) nel caso in cui qualcuno si imbattesse in questa domanda. –

+0

Questo è ottimo (+1), ma una cosa: perché utilizzare uno stile per sovrascrivere il colore di sfondo? Ciò significa che stai ignorando anche altri stili che potrebbero essere presenti nell'elemento Xamarin. Invece dovresti semplicemente impostare la proprietà del colore di sfondo individuale. – jbyrd