为 Entry 控件添加特定于平台的效果
- 使用 PCL 文件创建一个新的 Xamarin Forms 应用程序 - >新解决方案 - >多平台应用程序 - > Xamarin Forms - > Forms App; 将项目命名为
EffectsDemo
- 在 iOS 项目下,添加一个继承
PlatformEffect
类的新Effect
类并覆盖方法OnAttached
,OnDetached
和OnElementPropertyChanged
注意ResolutionGroupName
和ExportEffect
这两个属性,这些属性是从 PCL /共享项目中消耗此效果所必需的。
-
OnAttached
是定制逻辑进入的方法 -
OnDetached
是清理和取消注册的方法 -
OnElementPropertyChanged
是在不同元素的属性变化时触发的方法。要确定正确的属性,请检查确切的属性更改并添加逻辑。在这个例子中,OnFocus
将提供Blue
颜色,OutofFocus
将提供Red
颜色using System; using EffectsDemo.iOS; using UIKit; using Xamarin.Forms; using Xamarin.Forms.Platform.iOS; [assembly: ResolutionGroupName("xhackers")] [assembly: ExportEffect(typeof(FocusEffect), "FocusEffect")] namespace EffectsDemo.iOS { public class FocusEffect : PlatformEffect { public FocusEffect() { } UIColor backgroundColor; protected override void OnAttached() { try { Control.BackgroundColor = backgroundColor = UIColor.Red; } catch (Exception ex) { Console.WriteLine("Cannot set attacked property" + ex.Message); } } protected override void OnDetached() { throw new NotImplementedException(); } protected override void OnElementPropertyChanged(System.ComponentModel.PropertyChangedEventArgs args) { base.OnElementPropertyChanged(args); try { if (args.PropertyName == "IsFocused") { if (Control.BackgroundColor == backgroundColor) { Control.BackgroundColor = UIColor.Blue; } else { Control.BackgroundColor = backgroundColor; } } } catch (Exception ex) { Console.WriteLine("Cannot set property " + ex.Message); } }
}}
-
要在应用程序中使用此效果,在
PCL
项目下,创建一个名为FocusEffect
的新类,它继承自RoutingEffect
。这对于使 PCL 实例化特定于平台的效果实现至关重要。示例代码如下:using Xamarin.Forms; namespace EffectsDemo { public class FocusEffect : RoutingEffect { public FocusEffect() : base("xhackers.FocusEffect") { } } }
-
将效果添加到 XAML 中的
Entry
控件<?xml version="1.0" encoding="utf-8"?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:EffectsDemo" x:Class="EffectsDemo.EffectsDemoPage"> <StackLayout Orientation="Horizontal" HorizontalOptions="Center" VerticalOptions="Center"> <Label Text="Effects Demo" HorizontalOptions="StartAndExpand" VerticalOptions="Center" ></Label> <Entry Text="Controlled by effects" HorizontalOptions="FillAndExpand" VerticalOptions="Center"> <Entry.Effects> <local:FocusEffect> </local:FocusEffect> </Entry.Effects> </Entry> </StackLayout> </ContentPage>
https://i.stack.imgur.com/96stB.gif
https://i.stack.imgur.com/dDDuY.gif
由于效果仅在 iOS 版本中实现,当应用程序在 iOS Simulator
中运行时聚焦 Entry
背景颜色更改并且没有任何事情发生在 Android Emulator
,因为 Effect
未在 Droid
项目下创建