2016-05-03 4 views
0

Ich versuche, zwei Konzepte zu kombinieren, ein Standardsteuerelement zu erweitern, und application theming, indem Sie das Picker-Steuerelement erweitern und eine TextColor-Eigenschaft hinzufügen und über einen benutzerdefinierten Renderer auf der Android- (und iOS-) Plattform verfügen. Ich kann die Textfarbe Eigenschaft erfolgreich gesetzt und haben sie die Farbe an, wenn es statisch wie folgt festgelegt ist:Benutzerdefinierte Steuerelementeigenschaft von DynamicResource

<controls:ExtendedPicker TextColor="Red"/> 

Der letzte Schritt in diesem Prozess ist in der Lage sein, die Immobilie von einem Dynamic Resource zu ziehen und sie haben kann zur Laufzeit geändert werden.

<controls:ExtendedPicker Style="{DynamicResource pickerStyle}"/> 

und dann im Application.Resources Resource:

<Color x:Key="textColor"/> 
... 
<Style x:Key="pickerStyle" TargetType="controls:ExtendedPicker"> 
    <Setter Property="TextColor" Value="{DynamicResource textColor}" /> 
</Style> 

Beachten Sie, dass diese Methode für Textcolor Auswahl arbeitet mit nativen Steuerelemente wie Labels. Der Code wird kompiliert und ausgeführt, scheint jedoch nicht die Einstellung der dynamischen Ressourcenfarbe zu übernehmen, wenn sie zur Laufzeit geändert wird. Ich gehe davon aus, dass dies etwas ist, das mir bei meinem Custom Renderer fehlt, aber ich weiß nicht, wonach ich suchen soll.

Antwort

0

dies zur Laufzeit zu handhaben ich als die

OnElementChanged 

Methode, um die

OnElementPropertyChanged 

Methode in dem benutzerdefinierten Renderer eher außer Kraft zu setzen hatte.

0

Aufschalten der OnElementChanged Ihre benutzerdefinierten plattformabhängig machen, und Sie können einen Verweis auf Ihre Xamarin.Forms -basierte custom (subclassed) Kontrolle über die e.NewElement Eigenschaft erhalten.

So können Sie e.NewElement als Ihre individuelle Kontrolle werfen und erhalten, dass Klassen Eigenschaften (Ihre benutzerdefinierten Picker Farbe, die Sie in der XAML vergeben):

(e.NewElement as ExtendedPicker).TextColor; 

Etwas wie folgt aus:

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

     if (Control == null) { 
      ~~~~~~ 
     } 
     if (e.OldElement != null) { 
      ~~~~~~ 
     } 
     if (e.NewElement != null) { 
      var myPickerControl = (e.NewElement as ExtendedPicker). TextColor; 
      // Assign `myPickerControl` to your UI dependent control 
      ~~~~~~~ 
     } 
    } 
+0

OnElementChanged nur scheint bei der Erstellung aufzutreten. Wenn ich es zur Laufzeit ändere, habe ich herausgefunden, dass es nur funktioniert, wenn ich die OnElementPropertyChanged-Methode überschreibe. – Flea

+0

Ja, wenn Sie die Farbe nach der ersten Erstellung ändern möchten, sind Sie richtig !, da dies eine Änderung der Stütze und keine Änderung des Elements wäre. So oder so, der Punkt ist, dass Sie über die Ereignisargumente Zugriff auf Ihre benutzerdefinierte Farbe haben und diese nur Ihrem Steuerelement zuweisen müssen – SushiHangover

Verwandte Themen