我有以下
PlatformEffect Android项目
public class LabelShadowEffect : PlatformEffect
{
protected override void OnAttached()
{
...
}
protected override void OnDetached()
{
...
}
}
RoutingEffect .NetStandard库
public class ShadowEffect : RoutingEffect
{
...
}
Xaml
<controls:FontAwesomeLabel
...
<controls:FontAwesomeLabel.Effects>
<effects:ShadowEffect
DistanceX="2"
DistanceY="2"
Radius="2"
Color="{StaticResource HeaderTextShadowColor}" />
</controls:FontAwesomeLabel.Effects>
</controls:FontAwesomeLabel>
这很好用,尽管能够将其作为静态资源重用也很好。因此,我注意到可以设置属性Element.Effects
,其定义如下
public System.Collections.Generic.IList<Xamarin.Forms.Effect> Effects { get; }
我本以为我可以写一个xaml列表或数组并将其放入资源中并重用
即
Effects="{StaticResource StandardShadowEffect}"
尝试1 ,右键单击并创建类型,它会产生一个system:ArraySegment
<system:ArraySegment x:Key="StandardShadowEffect" x:TypeArguments="Effect">
</system:ArraySegment>
System.ArrayTypeMismatchException:尝试以元素形式访问元素 类型与数组不兼容
尝试2 ,列表
<generic:List x:Key="StandardShadowEffect" x:TypeArguments="Effect">
</generic:List>
System.ArrayTypeMismatchException:尝试以元素形式访问元素 类型与数组不兼容
尝试3 :数组
<x:Array x:Key="StandardShadowEffect" x:TypeArguments="Effect">
</x:Array>
编译错误
预期的IList类型
尝试4 :只需指定并使用
<effects:ShadowEffect x:Key="StandardShadowEffect"
DistanceX="2"
DistanceY="2"
Radius="2"
Color="{StaticResource HeaderTextShadowColor}" />
奇怪的是,最后一次尝试会编译并且不会抛出,但是没有效果
是否有这样的方法可以重用这样的效果,而不必在每个控件上都指定它?我开始认为需要为每个控件隐式指定效果“需要”
答案 0 :(得分:2)
documentation明确指出:
效果实例只能附加到单个控件。 因此,必须对效果进行两次解析才能在两个控件上使用它。
所以这应该是预期的行为。也许您可以尝试扩展“需要的” UI控件,并在后面的代码中添加新的效果实例。请记住,如果您在效果中进行了无尽的动画处理,则也应删除效果(微妙的部分)。