首页 > 其他分享 >MAUI新生1.3-XAML语法基础:标记扩展原理

MAUI新生1.3-XAML语法基础:标记扩展原理

时间:2022-11-16 21:59:21浏览次数:66  
标签:标记 扩展 XAML 1.3 IMarkupExtension public serviceProvider MAUI ProvideValue

标记扩展,本质上是IMarkupExtension或者IMarkupExtension<T>接口的实现类。这两个接口,均定义了ProvideValue方法。注意,IMarkupExtension<T>继承自IMarkupExtension,如果定义的标记扩展类,需要实现IMarkupExtension<T>泛型接口,则返回值为object和返回值为泛型T的两个ProvideValue方法,均要实现。

public interface IMarkupExtension
{
    object ProvideValue(IServiceProvider serviceProvider);
}

public interface IMarkupExtension<out T> : IMarkupExtension
{
    new T ProvideValue(IServiceProvider serviceProvider);
}

 

下面以官方文档的例子,来定义一个为颜色属性赋值的标记扩展。

//创建一个标记扩展类
public class HslColorExtension : IMarkupExtension<Color>
{
    //定义4个属性,“使用”标记扩展时,可以给属性赋值初始化
    public float H { get; set; }
    public float S { get; set; }
    public float L { get; set; }
    public float A { get; set; } = 1.0f;

    //ProvideValue的返回值,将提供给 使用了 标记扩展的元素
    public Color ProvideValue(IServiceProvider serviceProvider)
    {
        return Color.FromHsla(H,S,L,A);
    }

    //这段代码主要原因是因为IMarkupExtension<T>继承自IMarkupExtension
    //所以父接口的方法也要实现,这个方法可以调用上面的ProvideValue方法
    object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
    {
        return (this as IMarkupExtension<Color>).ProvideValue(serviceProvider);
    }
}


//在XAML中,分别用大括号和尖括号的方式来使用自定义的标记扩展
<ContentPage
    x:Class="MauiApp7.MainPage"
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:local="clr-namespace:MauiApp7"
    xmlns:localext="clr-namespace:MauiApp7.MarkupExtension">

    <StackLayout Padding="10,0">
        <Label Text="大括号语法使用自定义的标记扩展" TextColor="{localext:HslColorExtension H=0.2, S=0.5, L=0.7}" />
        <Label Text="尖括号语法使用自定义的标记扩展">
            <Label.TextColor>
                <localext:HslColorExtension H="0.1" S="0.3" L="0.5"/>
            </Label.TextColor>
        </Label>
    </StackLayout>
</ContentPage>

 

看完以上自定义的标记扩展,有没有恍然大悟的感觉?我们说元素的本质,是实例化一个对象。那么标记扩展的本质,也是在实例化一个对象,只是XAML编译器,会调用标记扩展对象的ProvideValue方法,并将返回值赋值给使用了标记扩展的 属性。大括号的标记扩展语法,直接给 属性 赋值,更加简洁;而尖括号语法,给 属性元素 赋值,可以完成更加复杂的表达。x:Array不能使用大括号的原因,估计是因为数组表达比较复杂,无法在大括号里写,所以只能使用尖括号的方式。

 

最后,我们来看一下ProvideValue方法的IServiceProvider参数,这是一个服务定位器吗?通过它,可以获得使用了标记扩展的XAML文件对象。比如下面这段代码,可以获取使用了标记扩展的对象,IProvideValueTarget接口定义了两个属性, TargetObject和TargetProperty。对照上例,TargetObject就是Lable,TargetProperty就是TextColor。通过ServiceProvider获得XAML文件的对象后,我们就可以执行更加复杂的逻辑计算,以返回我们需要的值。

var provideValueTarget = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;

 

标签:标记,扩展,XAML,1.3,IMarkupExtension,public,serviceProvider,MAUI,ProvideValue
From: https://www.cnblogs.com/functionMC/p/16897623.html

相关文章

  • MAUI / MAUI Blazor 环境路径测试笔记
    测试代码Tools服务类多平台实现MAUIpublicstringCacheDirectory()=>FileSystem.CacheDirectory;publicstringAppDataDirectory()=>FileSystem.AppDataDirecto......
  • 【MAUI】MAUI的项目结构
    阅前须知:系列随笔讨论的是.NETMAUI应用(即APP),而不是.NETMAUIBlazor应用。在VisualStudio中创建的项目如下图所示(注意选中的项目)。创建好项目之后,在解决方案管理......
  • MASA MAUI Plugin (六)集成个推,实现本地消息推送[Android] 篇
    背景MAUI的出现,赋予了广大Net开发者开发多平台应用的能力,MAUI是Xamarin.Forms演变而来,但是相比Xamarin性能更好,可扩展性更强,结构更简单。但是MAUI对于平台相关的实现并不......
  • MAUI新生1.2-XAML语法基础:标记扩展{}
    标记扩展,使属性值可以引用其他源的值或对象,比如引用资源字典、引用其它控件的属性值、绑定ViewModel类属性值等。标记扩展的语法有大括号{}和尖括号<>两种方式,但x:Array比......
  • Day11.3:利用for循环打印三角形——思维详解
    利用for循环打印三角形要求:利用for循环打印出以下三角形思路与分析:观察三角形,每一行的左边其实都有打印内容的,只是被空格替换了;将左边空格的部分替换成*,补齐后会得......
  • 如何在 .NET MAUI 中加载 json 文件?
    引言:按core传统方式添加AddJsonFile("appsettings.json")在windows平台和ssr工作正常,但是在ios和android无法用这种方式,因为资源生成方式不一样.使用内置资源方......
  • IDEA使用.创建多级文件夹失效(2022.1.3汉化)
    【注:这是2022.1.3汉化之后的版本对应的位置】【更早写的可参考:(200条消息)IDEA创建多级文件夹_Sentimentsans的博客-CSDN博客】 ......
  • 发布 .NET 7 MAUI / MAUI Blazor 应用到 Windows 应用商店
    .NETMAUI目前仅允许发布MSIX包。创建签名证书发布到本地传送门[https://www.cnblogs.com/densen2014/p/16567384.html]使用VisualStudio2022发布到Windows应......
  • WPF中的XAML学习方式
    XMLXAML完全符合XML的标准XML是很容易学习的,要先学会元素、属性、命名空间等语法,然后再看XAML语句的时候就不感到陌生了。XAML语法和C#的关联元素一般都对应......
  • MAUI新生-XAML语法基础:语法入门Element&Property&Event&Command
    一、XAML(MAUI的XAML)和HTML两者相似,都是标签语言(也叫标记)组成的树形文档。每个标签元素,可视为一个对象,通过“键=值”形式的标签属性(Attribute),为对象的属性(Property)、事件......