2017-01-24 1 views
2

ich einen delared habe folgendeBenutzerdefinierte Renderer für InhaltAlle (iOS)

public class ViewBase : ContentView 
{ 
    //... 
} 

Wenn ich das in XAML

<local:ViewBase xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:local="clr-namespace:MyForms;" 
    x:Class="MyForms.Finder" 
    BackgroundColor="Color.Yellow"> 

    <!-- ... --> 

</local:ViewBase> 

Wenn ich ein Custom dafür verwenden und sogar (wie unten) zu tun nichts drin, die BackgroundColor von oben ist nicht gesetzt. Wenn ich die folgenden Zeilen nicht definiere, ist der Hintergrund wie erwartet gelb.

[assembly: ExportRenderer(typeof(ViewBase), typeof(ViewRendererBase))] 
namespace MyiOS 
{  
    public class ViewRendererBase : ViewRenderer 
    { 
    } 
} 

BackgroundColor ist eine Eigenschaft von ViewRenderer. Ich habe einen Blick in den Code geworfen, es scheint, als wäre Control nicht gesetzt (ich rufe SetNativeControl nicht auf), es kann Control.BackgroundColor nicht auf einen Wert setzen. Aber warum passiert das? Ich vermute, dass etwas mit der Vererbung von ViewRenderer nicht stimmt, da das Standardverhalten etwas anderes in ContentView verwendet !?

+0

Haben Sie versucht, ihm eine Breite und eine Höhe zu geben? Sie sind wahrscheinlich 0. –

+0

Es ist nichts falsch mit der Ansicht selbst, Größe und Layout sind korrekt. Aber die BackgroundColor-Eigenschaft funktioniert nicht, wenn ich meinen eigenen (leeren) CustomRenderer definiere. – Florian

Antwort

4

Nicht sicher, ob dies ein Fehler in unserer Dokumentation [1] oder ein Fehler in der iOS ViewRenderer Code [2] für die SetBackgroundColor Methode ist. Es gibt also einige Möglichkeiten, dies zu umgehen. Eine davon ist Ihr benutzerdefinierten Renderer vererben VisualElementRenderer<T> stattdessen zu haben, zum Beispiel:

public class ViewBaseRenderer : VisualElementRenderer<ContentView> 
{ 
    //... 
} 

Wenn auf dem Standard-Renderer-Typ in iOS Code Überprüfung mit:

var contentRenderer = Platform.CreateRenderer(new ContentView()) 
var rendererType = contentRenderer.GetType(); 

rendererType ist ein VisualElementRenderer<T>, so scheint dies zu Der Standardrenderer, der von Forms verwendet wird, scheint also ein Fehler in den Dokumenten zu sein.

Eine weitere „Abhilfe“ wäre die ViewRenderer zu verwenden, aber die SetBackgroundColor Methode überschreiben:

public class ViewBaseRenderer : ViewRenderer 
{ 
    protected override void SetBackgroundColor(Color color) 
    { 
     base.SetBackgroundColor(color); 

     if (NativeView == null) 
      return; 

     if (color != Color.Default) 
      NativeView.BackgroundColor = color.ToUIColor(); 
    } 

ich dies mit dem Xamarin oben gebracht haben Forms Team, um zu bestimmen, ob es sich um einen Fehler in der Dokumentation oder ein Fehler ist in der Forms iOS Platform Code für die ViewRenderer. Wenn Sie den Formular-Quellcode betrachten, den ich verlinkt habe [2], sehen Sie, dass, wenn Control null ist, was es in diesem Fall ist, die Hintergrundfarbe nie gesetzt wird. Indem Sie den Code überschreiben und hinzufügen, um die Hintergrundfarbe für NativeView festzulegen, können Sie diesen möglichen Fehler umgehen.

So scheint es anscheinend die Dokumente sind fehlerhaft. Wenn Sie ViewRenderer verwenden, müssen Sie die Control selbst einstellen. Andere Renderer, die von ViewRenderer erben, wie LabelRender, setzen die Control bereits, aber ViewRenderer nicht, also müssten Sie SetNativeControl() in der OnElementChanged überschreiben aufrufen, um ein natives Steuerelement zu erstellen und festzulegen. Sieh diesen Forenbeitrag [3]. Persönlich denke ich, dass man von den Renderer erben sollte, die standardmäßig verwendet wird, die in diesem Fall ist ein VisualElementRenderer<T>

[1] https://developer.xamarin.com/guides/xamarin-forms/custom-renderer/renderers/#Layouts

[2] https://github.com/xamarin/Xamarin.Forms/blob/74cb5c4a97dcb123eb471f6b1dffa1267d0305aa/Xamarin.Forms.Platform.iOS/ViewRenderer.cs#L99

[3] https://forums.xamarin.com/discussion/comment/180839#Comment_180839

+0

Danke für die tolle Antwort.VisualElementRenderer war genau das, was ich gesucht und nicht gefunden habe. Wie für den anderen Ansatz, funktioniert SetNativeControl (NativeView) offenbar nicht, gibt es einen Fehler: kann keine Ansicht zu sich selbst hinzufügen (oder so ähnlich). – Florian

Verwandte Themen