为 Entry 控件添加特定于平台的效果

  1. 使用 PCL 文件创建一个新的 Xamarin Forms 应用程序 - >新解决方案 - >多平台应用程序 - > Xamarin Forms - > Forms App; 将项目命名为 EffectsDemo
  2. 在 iOS 项目下,添加一个继承 PlatformEffect 类的新 Effect 类并覆盖方法 OnAttachedOnDetachedOnElementPropertyChanged 注意 ResolutionGroupNameExportEffect 这两个属性,这些属性是从 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);
         }
     }
    

    }}

  1. 要在应用程序中使用此效果,在 PCL 项目下,创建一个名为 FocusEffect 的新类,它继承自 RoutingEffect。这对于使 PCL 实例化特定于平台的效果实现至关重要。示例代码如下:

    using Xamarin.Forms;
    namespace EffectsDemo
    {
        public class FocusEffect : RoutingEffect
        {
            public FocusEffect() : base("xhackers.FocusEffect")
            {
            }
        }
    }
    
  2. 将效果添加到 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 项目下创建