Xamarin:重用效果

时间:2018-06-25 02:16:32

标签: c# xamarin.forms

我有以下

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}" />

奇怪的是,最后一次尝试会编译并且不会抛出,但是没有效果


是否有这样的方法可以重用这样的效果,而不必在每个控件上都指定它?我开始认为需要为每个控件隐式指定效果“需要”

1 个答案:

答案 0 :(得分:2)

documentation明确指出:

  

效果实例只能附加到单个控件。   因此,必须对效果进行两次解析才能在两个控件上使用它。

所以这应该是预期的行为。也许您可以尝试扩展“需要的” UI控件,并在后面的代码中添加新的效果实例。请记住,如果您在效果中进行了无尽的动画处理,则也应删除效果(微妙的部分)。