标记扩展,使属性值可以引用其他源的值或对象,比如引用资源字典、引用其它控件的属性值、绑定ViewModel类属性值等。标记扩展的语法有大括号{}和尖括号<>两种方式,但x:Array比较特殊,只能使用尖括号,下个章节深入学习标记扩展后,将能够理解两者的区别。为方便学习和记忆,将标记扩展归纳为以下几类:
- 一、引用资源:StaticResource、DynamicResource
- 二、引用元素:x:Reference,RelativeSource
- 三、引用静态成员:x:Static
- 四、特殊值:x:Array、x:Null、x:Type
- 五、数据绑定:属性绑定Binding、模板绑定TemplateBinding
- 六、其它:跨平台OnPlatform/OnIdiom、字体图标FontImage、主题样式AppThemeBinding
一、引用资源:StaticResource、DynamicResource
每个继承自VisualElement的对象,都有一个Resources属性,属性值为Dictionary<string,object>类型的集合对象,这些集合对象可作为资源,提供给控件树中的子元素使用。
1 <ContentPage 2 x:Class="MauiApp7.MainPage" 3 xmlns="http://schemas.microsoft.com/dotnet/2021/maui" 4 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"> 5 6 <ContentPage.Resources> 7 <Color x:Key="PrimaryColor">Black</Color> 8 </ContentPage.Resources> 9 <StackLayout> 10 <Label Text="HelloWorld" TextColor="{StaticResource PrimaryColor}" /> 11 </StackLayout> 12 13 </ContentPage>
代码解读:
6-8行:在ContentPage的Resources属性上,创建一个Dictionary<string,object>集合元素,其中键为“PrimaryColor”,值为Color类型的对象。Color类型有多个重载构造函数,传入字符串颜色名称,为其中一种创建对象的方式。
10行:通过StaticResource标记扩展,使TextColor属性的值,引用key为“PrimaryColor”的字典资源。框架会从元素自身的Resources属性开始,延着控件树向上查找匹配,如果找到,则返回其值,查找终止。如果未找到,会一直延伸到应用的根元素App.xaml的Application为止。如果在Application的Resources属性中都未找到,则会返回一个XamlParseException编译异常。
补充说明:
①定义Resources属性的代码中,隐藏了内容属性,完整代码应是:<ContentPage.Resources><ResourceDictionary>......</ResourceDictionary></ContentPage.Resources>
②StaticResource和DynamicResource的使用方法一致,两者唯一的区别在于,如果在运行时修改引用的数据源,StaticResource不会更新,而DynamicResource会实时更新
③资源字典理论上可以放任何对象资源,但一般用于创建样式、颜色、控件模板、数据模板、转换器的对象资源
二、引用元素/控件:x:Reference,RelativeSource
进行属性绑定时,除了MVVM模式中,绑定ViewModel的属性,有时还会绑定当前页面或指定页面的元素/控件的属性值,通过x:Reference或RelativeSource来设置绑定源。
1、x:Reference,直接通过元素名称(使用x:Name属性定义)来引用
1 <ContentPage 2 x:Class="MauiApp7.MainPage" 3 xmlns="http://schemas.microsoft.com/dotnet/2021/maui" 4 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"> 5 6 <StackLayout Padding="10"> 7 8 <Slider 9 x:Name="slider" 10 Maximum="100" 11 VerticalOptions="Center" /> 12 13 <Label Text="{Binding Value, Source={x:Reference slider}}" /> 14 15 <Label 16 BindingContext="{x:Reference slider}" 17 Rotation="{Binding Value}" 18 Text="HelloWord" /> 19 20 </StackLayout> 21 22 </ContentPage>
代码解读:
9行:通过x:Name属性,给Slider对象定义一个变量名称。
13行:直接定义Binding属性绑定,将属性Text的值,与slider对象的Value属性绑定。其中Binding的属性Source,通过x:Reference扩展标记,引用slider对象。
16-17行:先定义Label元素的绑定上下文BindingContext为slider,此处的BindingContext可以认为就是绑定的Source。定义好绑定上下文后,可以直接通过Binding绑定上下文拥有的属性。
补充说明:
①包含绑定源和路径的完整写法是{Binding Path=Value, Source={x:Reference slider}},上例子Path省略了
2、RelativeSource,从当前元素开始,延着控件树,以相对位置的方式,查子父或子元素
三、引用静态成员:x:Static
引用C#定义的静态成员、枚举、常量等
1 //先定义一个C#静态类 2 public static class AppConstants 3 { 4 public static double Title1FontSize = 40; 5 public static double Title2FontSize = 32; 6 public static double Title3FontSize = 28; 7 public static double ContentFontSize = 16; 8 } 9 10 //在XAML中引用静态成员 11 <ContentPage 12 x:Class="MauiApp7.MainPage" 13 xmlns="http://schemas.microsoft.com/dotnet/2021/maui" 14 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 15 xmlns:local="clr-namespace:MauiApp7"> 16 17 <StackLayout Padding="10"> 18 <Label Text="This is Title" FontSize="{x:Static local:AppConstants.Title1FontSize}"/> 19 <Label Text="This is Content" FontSize="{x:Static local:AppConstants.ContentFontSize}"/> 20 </StackLayout> 21 22 </ContentPage>
代码解读:
15行:引入命名空间MauiApp7(案例项目名称),并起别名为local
18-19行:通过x:Static引入静态成员,访问方式【命名空间别名:类.属性】
四、特殊值:x:Array、x:Null、x:Type
标签:控件,元素,Reference,1.2,XAML,绑定,引用,MAUI,属性 From: https://www.cnblogs.com/functionMC/p/16890601.html