ListView が行の色を交互にできるようにする CustomRenderer を作成しようとしています。問題が発生しましたが、それがバグなのか、レンダラーを正しく実装していないだけなのかわかりません。
次のコードに対する私の期待は、各カスタム ビュー セルがその位置に基づいて色を取得することです。ただし、これは起こっていることではありません。このコードtv.IndexPathForCell(cell).Row
はセルのインデックスを返す必要があると思いますが、期待どおりに機能していません。現在、null値を返しています(セルが一部のビューではない場合はそうなるはずです)が、セルがテーブルビューの一部であるため、私の問題であると考えています。コメントアウトしてからvar index = tv.IndexPathForCell(cell).Row;
背景色を静的な値に設定すると、コードとビューは正しく機能します。さらに、null 値が原因で例外がスローされ、セルがベースに設定され、ビューがデフォルトの背景でレンダリングされます。
私は何か間違ったことをしていますか、他にもいくつか試しましたが、これが正しい方法だと思います。
c# コード:
[assembly: ExportRenderer(typeof(CustomViewCell), typeof(CustomViewCellRenderer))]
namespace AIM.iOS {
class CustomViewCellRenderer : ViewCellRenderer {
public override UITableViewCell GetCell(Cell item, UITableView tv) {
UITableViewCell cell;
try {
cell = base.GetCell(item, tv);
var customCell = (CustomViewCell)item;
var cell = base.GetCell(item, tv);
var index = tv.IndexPathForCell(cell).Row;
cell.BackgroundColor = (index % 2 == 0) ? Color.Gray.ToUIColor() :
Color.White.ToUIColor();
}catch (Exception ex){
string message = ex.Message;
cell = base.GetCell(item, tv);
}
return cell
}
}
}
ViewCell オブジェクトにバックグラウンド プロパティを追加する Xamarin-Forms-Labs から ExtendedViewCell クラスを拡張しています。
namespace AIMUI.Controls {
public class CustomViewCell : ExtendedViewCell {
public CustomViewCell() { }
}
}
Xaml は次のとおりです。
<localcontrols:ListView>
<ListView.ItemTemplate>
<DataTemplate>
<localcontrols:CustomViewCell>
<localcontrols:CustomViewCell.View>
</localcontrols:CustomViewCell.View>
</localcontrols:CustomViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</localcontrols:ListView>
編集:
わかりましたので、を使用してインデックスを取得する問題を解決しましたが、 var index = tv.IndexPathForRowAtPoint(cell.Center).Row;
これにより別の問題が発生しました。サブビューからページに戻るだけでなく、初めてでも完全に機能します。ただし、ページを離れてから別のビューに移動しmasterpage
て戻ってくると、すべてのアイテムの背景が灰色に設定されます。現在、私は新しいページを作成しmasterpage.details
、メニューから来たときにそれを に設定しています。