Xamarin.Forms 使用目标平台的本机控件呈现用户界面,从而让 Xamarin.Forms 应用程序为每个平台保留了相应的界面外观。凭借效果,无需进行自定义呈现器实现,即可自定义每个平台上的本机控件,通常用于细微的样式更改。

通过 Renderer 类可以在每个平台上以不同方式呈现每个页面、布局和控件,反过来又可以创建本机控件(对应于 Xamarin.Forms 表示),在屏幕上排列该控件,并添加共享代码中指定的行为。

效果。

效果

通过将PlatformEffect控件子类化,可以在特定于平台的项目中创建效果,然后通过将效果附加到Xamarin.Forms .NET Standard库或共享库项目中的适当控件来使用效果。

为什么要在自定义呈现器上使用效果?

效果简化了控件的自定义、可重用并且可以通过参数化进一步增加重用。

以下指南列出了在自定义呈现器上选择效果的情况:

  • 当更改特定于平台的控件的属性能达成所需结果时,建议使用效果。
  • 当需要替代特定于平台的控件的方法时,需要使用自定义呈现器。
  • 当需要替换实现 Xamarin.Forms 控件的特定于平台的控件时,需要使用自定义呈现器。

子类化 PlatformEffect 类

每个特定于平台的 PlatformEffect 类都公开以下属性:

  • Container – 引用用于实现布局的特定于平台的控件。
  • Control – 引用用于实现 Xamarin.Forms 控件的特定于平台的控件。
  • Element – 引用正在呈现的 Xamarin.Forms 控件。

呈现器基类和本机控件。

每个特定于平台的 PlatformEffect 类都公开以下方法,必须替代这些方法以实现效果:

  • overridden是执行控件自定义逻辑的位置,以及在效果无法应用于指定的 Xamarin.Forms 控件的情况下的异常处理。
  • 在每个特定于平台的效果类中,此方法的overridden是执行任何效果清除的位置,例如取消注册事件处理程序。

应始终检查已更改的属性,因为可多次调用此替代。

效果创建

例如,创建效果以实现 在指向 Entry 控件时更改其背景颜色。

在每个特定于平台的项目中创建效果的过程如下:

  1. 创建 PlatformEffect 类的子类。
  2. 替代 OnAttached 方法并写入自定义控件的逻辑。
  3. 根据需要替代 OnDetached 方法并写入清理控件自定义的逻辑。
  4. 请注意,每个项目只能应用一次该属性。
  5. 一个唯一的字符串,该字符串用于在将效果应用于控件之前定位该效果

然后,可以通过将效果附加到相应控件来使用该效果。

1、在各平台上创建效果

[assembly: ResolutionGroupName("MyCompany")]
[assembly: ExportEffect(typeof(EffectsDemo.Droid.FocusEffect), nameof(EffectsDemo.Droid.FocusEffect))]
namespace EffectsDemo.Droid
{
    public class FocusEffect : PlatformEffect
    {
protected override void OnAttached() {

在OnAttached()中设置控件【需要设置效果的控件】的一些外观。

属性ResolutionGroupName和ExportEffect的第二个参数,用于定位效果,"MyCompany.FocusEffect"【在使用效果时 需要】

2、使用效果(在XAML中)

Xamarin.Forms 自定义控件(呈现器和效果)

 

 RoutingEffect 类它表示一个独立于平台的效果,该效果包装通常特定于平台的内部效果。

在运行时初始化 Entry 时,向控件的 Effects 集合添加了 MyCompany.FocusEffect 的新实例。

传递参数

效果参数可以通过属性定义,从而可以重用效果。 然后,可以在实例化效果时通过为每个属性指定值来将参数传递给效果

1、将效果参数作为公共语言运行时(CLR)属性传递
公共语言运行时(CLR)属性可用于定义不响应运行时属性更改的效果参数。 本文演示了如何使用CLR属性将参数传递给效果。

2、将效果参数作为附加属性传递
附加属性可用于定义响应运行时属性更改的效果参数。 本文演示了如何使用附加属性将参数传递给效果,以及在运行时更改参数。

作为CLR属性的参数

创建效果参数

public class ShadowEffect : RoutingEffect
{
  public float Radius { get; set; }

  public Color Color { get; set; }

  public float DistanceX { get; set; }

  public float DistanceY { get; set; }

  public ShadowEffect () : base ("MyCompany.LabelShadowEffect")
  {            
  }
}
View Code

相关文章:

  • 2021-11-18
  • 2021-12-21
  • 2022-12-23
  • 2022-01-15
  • 2021-11-13
  • 2022-12-23
  • 2021-09-29
  • 2021-07-13
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-01-27
  • 2021-07-26
  • 2021-08-09
  • 2022-12-23
  • 2021-07-03
相关资源
相似解决方案