如何在XAML中仅为特定平台给控件添加Behaviour?
实现方案
针对Xamarin中仅在UWP平台生效Behavior/Effect的需求,可通过OnPlatform直接适配集合类元素,以下是两种常用实现方式:
方案1:直接在集合内声明OnPlatform
单Behavior场景
直接在Behaviors集合内嵌入OnPlatform,仅在UWP平台解析出对应的行为实例:
<Entry> <Entry.Behaviors> <!-- x:TypeArguments填写你要注入的元素类型,Behavior场景填Behavior --> <OnPlatform x:TypeArguments="Behavior"> <On Platform="UWP"> <!-- 替换为你自己实现的Behavior --> <local:YourCustomUwpBehaviour /> </On> <!-- 其余平台不写对应节点,就不会注入任何行为 --> </OnPlatform> </Entry.Behaviors> </Entry>
多Behavior场景
如果需要在UWP下同时添加多个行为,直接嵌套BehaviorCollection即可:
<Entry> <Entry.Behaviors> <OnPlatform x:TypeArguments="BehaviorCollection"> <On Platform="UWP"> <BehaviorCollection> <local:FirstUwpBehaviour /> <local:SecondUwpBehaviour /> </BehaviorCollection> </On> </OnPlatform> </Entry.Behaviors> </Entry>
Effect场景
和Behavior的用法完全一致,仅需修改x:TypeArguments为Effect:
<Label> <Label.Effects> <OnPlatform x:TypeArguments="Effect"> <On Platform="UWP"> <!-- 替换为你自己实现的Effect --> <local:YourCustomUwpEffect /> </On> </OnPlatform> </Label.Effects> </Label>
方案2:通过资源字典复用平台特定行为
如果同一个行为需要在多个控件上使用,可以将其定义为资源,减少重复代码:
<!-- 在页面/应用级资源中定义 --> <ContentPage.Resources> <OnPlatform x:Key="UwpOnlyBehaviour" x:TypeArguments="Behavior"> <On Platform="UWP"> <local:YourCustomUwpBehaviour /> </On> </OnPlatform> </ContentPage.Resources> <!-- 控件处直接引用资源即可 --> <Entry Behaviors="{StaticResource UwpOnlyBehaviour}" /> <Editor Behaviors="{StaticResource UwpOnlyBehaviour}" />
注意事项
x:TypeArguments的参数必须和注入的元素类型严格匹配,否则会触发编译错误- 若需要多平台添加不同的行为/效果,仅需新增对应平台的
<On Platform="xxx">节点即可,不需要的平台留空就不会注入任何内容 - 该方法兼容所有Xamarin.Forms正式版本,无需额外引入第三方库
内容的提问来源于stack exchange,提问作者Kikanye
相关产品推荐
相关产品推荐

