2015-08-26 19 views
5

Jestem fanem robienia jak najwięcej w Xaml, mam ATableView` z TableSection.Jak ustawić funkcję TableSection TextColor Xamarin.Forms?

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

Dla TextCell TextColor="#FFFFFF" wydaje się działać, jednak kiedy używam tego atrybutu na TableSection uzyskać to:

An unhandled exception occurred. 

Czy jest możliwe aby zmienić kolor TableSection z XAML?

Odpowiedz

3

Niestandardowe renderyry! Mam dwóch blogach na ten temat tutaj:

android: Xamarin.Forms TableView Section Custom Header on Android

iOS: Xamarin.Forms TableView Section Custom Header on iOS

Zasadniczo utworzyć widok niestandardowy, który dziedziczy TableView, a następnie niestandardowe renderujące, że wdrożenie niestandardowych TableViewModelRenderer. Stamtąd możesz zastąpić metody, aby uzyskać widok nagłówka tytułu sekcji.

Oto, co to może wyglądać dla Androida:

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

a na 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

To denerwujące, że jest to konieczne dla tak pozornie podstawowej rzeczy, ale myślę, że to właśnie pochodzi z próby wspierania tak wielu platform w ramach jednej biblioteki. – CullenJ

Powiązane problemy