Ooui-tws-port/Ooui.Forms/Cells/CellRenderer.cs

68 lines
2.2 KiB
C#

using Ooui.Forms.Extensions;
using System;
using Xamarin.Forms;
namespace Ooui.Forms.Cells
{
public class CellRenderer : IRegisterable
{
EventHandler _onForceUpdateSizeRequested;
static readonly BindableProperty RealCellProperty =
BindableProperty.CreateAttached ("RealCell", typeof (CellElement), typeof (Cell), null);
public virtual CellElement GetCellElement (Cell cell, CellElement reusableElement, List listView)
{
var cellElement = reusableElement ?? CreateCellElement (cell);
cellElement.Cell = cell;
WireUpForceUpdateSizeRequested (cell, cellElement);
UpdateBackground (cellElement, cell);
return cellElement;
}
protected static CellElement GetRealCell (BindableObject cell)
{
return (CellElement)cell.GetValue (RealCellProperty);
}
protected static void SetRealCell (BindableObject cell, CellElement renderer)
{
cell.SetValue (RealCellProperty, renderer);
}
protected virtual CellElement CreateCellElement (Cell cell)
{
return new CellElement ();
}
protected virtual void OnForceUpdateSizeRequest (Cell cell, CellElement cellElement)
{
cellElement.Style.Height = (int)cell.RenderHeight;
}
protected void UpdateBackground (CellElement cellElement, Cell cell)
{
var backgroundColor = Xamarin.Forms.Color.Default;
if (backgroundColor == Xamarin.Forms.Color.Default && cell.RealParent is VisualElement element)
backgroundColor = element.BackgroundColor;
cellElement.Style.BackgroundColor = backgroundColor.ToOouiColor (Xamarin.Forms.Color.White);
}
protected void WireUpForceUpdateSizeRequested (Cell cell, CellElement cellElement)
{
cell.ForceUpdateSizeRequested -= _onForceUpdateSizeRequested;
_onForceUpdateSizeRequested = (sender, e) => {
OnForceUpdateSizeRequest (cell, cellElement);
};
cell.ForceUpdateSizeRequested += _onForceUpdateSizeRequested;
}
}
}