是的,也许不是。
是的:您可以为想要自定义的视图类型创建自定义渲染器,这将为您提供 XAML 和 iOS 应用程序之间的链接。在 iOS 端,您可以对所需的所有库执行所有调用。然后,您可以创建附加属性(例如下面的样式示例),这些属性可以包含配置渲染所需的附加信息,并将这些附加属性放在样式资源中并在项目中使用它们。Xamarin.Forms 尚不支持合并资源字典,但您可以编写一些代码来执行此操作,以便您的所有样式都在一个位置
但是......
也许不是: Xamarin.Forms 中有许多预定义的控件及其各自的渲染器,很难为框架创建一个适用于所有场景的一致插件,例如 ListView 中的按钮可能无法正确呈现(试一试)
如果您确实试一试,一旦您拥有适用于属性的基本渲染器,您就可以将一组属性与样式扩展打包在一起
public class Setter
{
public string Property { get; set; }
public object Value { get; set; }
public string ConverterKey { get; set; }
public object ConverterParameter { get; set; }
}
[ContentProperty ("Children")]
public class Style
{
public ResourceDictionary Resources { get; set; }
public Style ()
{
Children = new List<Setter> ();
}
public List<Setter> Children { get; private set; }
public static readonly BindableProperty StyleProperty =
BindableProperty.CreateAttached<BindableObject, Style> ((bob) => GetStyle (bob), null, BindingMode.OneWay
, propertyChanged: (bindable, oldvalue, newvalue) => {
if (newvalue != null) {
var tinf = bindable.GetType ().GetTypeInfo ();
foreach (var setter in newvalue.Children) {
PropertyInfo pinfo = null;
while (pinfo == null && tinf != null) {
pinfo = tinf.DeclaredProperties.FirstOrDefault (p => p.Name == setter.Property);
if (pinfo == null) {
tinf = tinf.BaseType.GetTypeInfo ();
if (tinf == typeof(object).GetTypeInfo ())
break;
}
}
if (pinfo != null) {
object convertedValue = null;
if (setter.ConverterKey != null && newvalue.Resources != null) {
object valCon;
if (newvalue.Resources.TryGetValue (setter.ConverterKey, out valCon) && valCon != null) {
if (valCon is IValueConverter)
convertedValue = ((IValueConverter)valCon).Convert (setter.Value, pinfo.PropertyType, setter.ConverterParameter, System.Globalization.CultureInfo.CurrentUICulture);
else if (valCon is TypeConverter)
convertedValue = ((TypeConverter)valCon).ConvertFrom (setter.Value);
else
convertedValue = Convert.ChangeType (setter.Value, pinfo.PropertyType);
} else
convertedValue = Convert.ChangeType (setter.Value, pinfo.PropertyType);
} else
convertedValue = Convert.ChangeType (setter.Value, pinfo.PropertyType);
pinfo.SetMethod.Invoke (bindable, new [] { convertedValue });
}
}
}
});
public static Style GetStyle (BindableObject bindable)
{
return (Style)bindable.GetValue (StyleProperty);
}
public static void SetStyle (BindableObject bindable, Style value)
{
bindable.SetValue (StyleProperty, value);
}
}
在 XAML 中...
<f:Style x:Key="stackStyle">
<f:Style.Resources>
<ResourceDictionary>
<ColorTypeConverter x:Key="colorConverter" />
</ResourceDictionary>
</f:Style.Resources>
<f:Setter Property="BackgroundColor" Value="#3898DC" ConverterKey="colorConverter" />
</f:Style>
...
<StackLayout f:Style.Style="{StaticResource stackStyle}">
...