2015-08-26 81 views
5

我是一個儘可能在xaml中做的粉絲,我有一個帶TableSection的TableView`。如何設置TextColor Xamarin.Forms TableSection?

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

對於TextCell TextColor="#FFFFFF"似乎工作,但每當我用這個屬性上TableSection我得到這個:

An unhandled exception occurred. 

是否可以更改與XAML的TableSection的顏色嗎?

回答

3

自定義渲染器!我對這個有兩家博客文章:

安卓Xamarin.Forms TableView Section Custom Header on Android

的iOS:Xamarin.Forms TableView Section Custom Header on iOS

基本上,創建一個繼承TableView,實現自定義TableViewModelRenderer然後自定義渲染器自定義視圖。從那裏你可以覆蓋方法來獲取節標題的標題視圖。

這裏有可能是什麼樣子的Android:

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

而在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

令人討厭的是,對於這樣一個看似基本的東西來說這是必需的,但我想這正是試圖在單個庫下支持如此之多的平臺的原因。 – CullenJ

相關問題