2015-08-26 30 views
5

Ich bin ein Fan von so viel wie möglich in Xaml zu tun, ich habe aTableView mit einer TableSection.Wie setze ich TextColor Xamarin.Forms TableSection?

<TableView Intent="Menu"> 
    <TableRoot> 
      <TableSection Title="Test Section" TextColor="#FFFFFF"> 
       <TextCell Text="Test Item" TextColor="#FFFFFF"/> 
      </TableSection> 
    </TableRoot> 
</TableView> 

Für TextCell TextColor="#FFFFFF" scheint jedoch zu arbeiten, wenn ich dieses Attribut auf einem Table verwende ich diese:

An unhandled exception occurred. 

Ist es möglich, die Farbe des Table mit XAML zu ändern?

Antwort

3

Benutzerdefinierte Renderer! Ich habe zwei Blog-Posts zu diesem Thema hier:

Android: Xamarin.Forms TableView Section Custom Header on Android

iOS: Xamarin.Forms TableView Section Custom Header on iOS

Grundsätzlich eine benutzerdefinierte Ansicht erstellen, die TableView erbt, dann benutzerdefinierte Renderer, die benutzerdefinierte TableViewModelRenderer implementieren. Von dort aus können Sie Methoden überschreiben, um die Header-Ansicht für den Abschnittstitel zu erhalten.

Hier ist, was das wie für Android aussehen könnte:

public class ColoredTableViewRenderer : TableViewRenderer 
{ 

    protected override TableViewModelRenderer GetModelRenderer(Android.Widget.ListView listView, TableView view) 
    { 
     return new CustomHeaderTableViewModelRenderer(Context, listView, view); 
    } 

    private class CustomHeaderTableViewModelRenderer : TableViewModelRenderer 
    { 
     private readonly ColoredTableView _coloredTableView; 

     public CustomHeaderTableViewModelRenderer(Context context, Android.Widget.ListView listView, TableView view) : base(context, listView, view) 
     { 
      _coloredTableView = view as ColoredTableView; 
     } 

     public override Android.Views.View GetView(int position, Android.Views.View convertView, ViewGroup parent) 
     { 
      var view = base.GetView(position, convertView, parent); 

      var element = GetCellForPosition(position); 

      // section header will be a TextCell 
      if (element.GetType() == typeof(TextCell)) 
      { 
       try 
       { 
        // Get the textView of the actual layout 
        var textView = ((((view as LinearLayout).GetChildAt(0) as LinearLayout).GetChildAt(1) as LinearLayout).GetChildAt(0) as TextView); 

        // get the divider below the header 
        var divider = (view as LinearLayout).GetChildAt(1); 

        // Set the color 
        textView.SetTextColor(_coloredTableView.GroupHeaderColor.ToAndroid()); 
        textView.TextAlignment = Android.Views.TextAlignment.Center; 
        textView.Gravity = GravityFlags.CenterHorizontal; 
        divider.SetBackgroundColor(_coloredTableView.GroupHeaderColor.ToAndroid()); 
       } 
       catch (Exception) { } 
      } 

      return view; 
     } 
    } 
} 

Und das auf iOS:

public class ColoredTableViewRenderer : TableViewRenderer 
{ 
    protected override void OnElementChanged(ElementChangedEventArgs<TableView> e) 
    { 
     base.OnElementChanged(e); 
     if (Control == null) 
      return; 

     var coloredTableView = Element as ColoredTableView; 
     tableView.WeakDelegate = new CustomHeaderTableModelRenderer(coloredTableView); 
    } 



    private class CustomHeaderTableModelRenderer : UnEvenTableViewModelRenderer 
    { 
     private readonly ColoredTableView _coloredTableView; 
     public CustomHeaderTableModelRenderer(TableView model) : base(model) 
     { 
      _coloredTableView = model as ColoredTableView; 
     } 
     public override UIView GetViewForHeader(UITableView tableView, nint section) 
     { 
      return new UILabel() 
      { 
       Text = TitleForHeader(tableView, section), 
       TextColor = _coloredTableView.GroupHeaderColor.ToUIColor(), 
       TextAlignment = UITextAlignment.Center 
      }; 
     } 
    } 
} 
+1

Es ist ärgerlich, dass dies für solch ein scheinbar einfaches Ding notwendig ist, aber ich denke, dass es nur darum geht, so viele Plattformen unter einer einzigen Bibliothek zu unterstützen. – CullenJ

1

Laut der offiziellen documentation for TableSection sind Sie kein Glück. Ich fürchte, Sie müssten einen benutzerdefinierten Renderer für eine Unterklasse von TableSection class schreiben und eine zusätzliche Eigenschaft des Typs Xamarin.Forms.Color verfügbar machen. Dann könnten Sie die Farbe von XAML einstellen.

+2

Table eine versiegelte Klasse ist. Es kann keine Unterklasse haben. – dsnunez

Verwandte Themen