到目前为止我想出了这个代码.我的问题是我想将一个样式传递给渲染器,我不知道如何传递一个styleId.
public class LabelBodyCustomRenderer : LabelRenderer
{
public LabelBodyCustomRenderer()
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
{
base.OnElementChanged(e);
if (Control != null)
Control.Font = UIFont.GetPreferredFontForTextStyle(UIFontTextStyle.Body);
}
protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == Label.TextColorProperty.PropertyName
|| e.PropertyName == Label.FontProperty.PropertyName
|| e.PropertyName == Label.TextProperty.PropertyName
|| e.PropertyName == Label.FormattedTextProperty.PropertyName)
{
switch (e.StyleId)
{
case "Body":
Control.Font = UIFont.GetPreferredFontForTextStyle(UIFontTextStyle.Body);
break;
case "Callout":
Control.Font = UIFont.GetPreferredFontForTextStyle(UIFontTextStyle.Callout);
break;
case "Caption1":
Control.Font = UIFont.GetPreferredFontForTextStyle(UIFontTextStyle.Caption1);
break;
case "Caption2":
Control.Font = UIFont.GetPreferredFontForTextStyle(UIFontTextStyle.Caption2);
break;
case "Footnote":
Run Code Online (Sandbox Code Playgroud)
我看到了另一个例子,它是这样做的,代码使用了item.StyleId.但是,这是从标签上呈现完全不同的,所以我很感兴趣,看看类似的东西可以为上述将为labelRenderer来完成:
public class TextCellCustomRenderer : TextCellRenderer
{
CellTableViewCell cell;
public override UITableViewCell GetCell(Cell item, UITableViewCell reusableCell, UITableView tv)
{
var textCell = (TextCell)item;
var fullName = item.GetType().FullName;
cell = tv.DequeueReusableCell(fullName) as CellTableViewCell;
if (cell == null)
{
cell = new CellTableViewCell(UITableViewCellStyle.Value1, fullName);
}
else
{
cell.Cell.PropertyChanged -= cell.HandlePropertyChanged;
//cell.Cell.PropertyChanged -= Current_PropertyChanged;
}
Run Code Online (Sandbox Code Playgroud)
创建一个派生自Label - MyLabel的类.将绑定属性MyStyleId添加到MyLabel.更新渲染器以渲染MyLabel而不是所有标签.
MyLabel类
public class MyLabel : Label
{
public static readonly BindableProperty MyStyleIdProperty =
BindableProperty.Create("MyStyleId", typeof(string), typeof(MyLabel), "Body");
public string MyStyleId
{
get { return (string)GetValue(MyStyleIdProperty); }
}
}
Run Code Online (Sandbox Code Playgroud)
XAML
<local:MyLabel MyStyleId="Header" Text="Custom Label"></local:MyLabel>
Run Code Online (Sandbox Code Playgroud)
别忘了定义你的"本地"
xmlns:local="clr-namespace:ButtonRendererDemo;assembly=ButtonRendererDemo"
Run Code Online (Sandbox Code Playgroud)
渲染
[assembly: ExportRenderer(typeof(MyLabel), typeof(MyLabelRenderer))]
namespace ButtonRendererDemo.iOS
{
public class MyLabelRenderer : LabelRenderer
{
//protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
//{
// base.OnElementChanged(e);
// if (e.NewElement != null)
// {
// var label = e.NewElement as MyLabel;
// if (label != null) //sanity check
// {
// var styleId = label.MyStyleId;
// }
// }
//}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == "Renderer")
{
var label = sender as MyLabel;
if (label != null) //sanity check
{
switch(label.MyStyleId)
{
case "Body":
break;
case "Header":
break;
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |