首页 > 其他分享 >MAUI新生1.4-XAML语法基础:x命名空间xmlns:x

MAUI新生1.4-XAML语法基础:x命名空间xmlns:x

时间:2022-11-19 23:03:15浏览次数:74  
标签:1.4 代码 xmlns XAML 元素 编译 类型 public

x命名空间,又叫XAML命名空间,作用于XAML的编译过程。我们知道,XAML代码,最终通过XAML编译器,编译为中间代码IL,并与后台C#代码的编译结果合并。而在编译的过程中,经常需要告诉编译器一些重要信息,比如应该与哪个C#类的编译结果合并、XAML声明的元素是public还是private、元素的变量名是什么......这些可以和XAML编译器沟通的工具,都在x命名空间中。【xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"】,这是引入x命名空间的代码,x是命名空间的别名,也可以使用y或者z等,使用x只是约定俗成的习惯。x命名空间的工具,可以划分为四大类:属性、标记扩展、指令和数据类型。常用的如下所示:

  • 属性,9个:x:Class、x:ClassModifier、x:Name、x:FiledModifier、x:Key、x:Arguments、x:FactoryMethod、x:TypeArguments、x:DataType
  • 标记扩展,4个:x:Array、x:Null、x:Type、x:Static
  • 指令,2个:x:Code、x:XData
  • 类型,14个:x:Byte、x:Int16、x:Int32、x:Int64、x:Single、x:Double、x:Decimal、x:Boolean、x:Char、x:String、x:DateTime、x:TimeSpan、x:Object

 

一、属性:

1、x:Class。将当前XAML文件的编译结果,与后台代码中的指定类合并。只能作为页面根元素的属性使用,x:Class的值所指向的后台类,必须使用partial关键字且继承自根元素的类型。

//XAML文件的根元素
<ContentPage
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="MauiApp7.MainPage"
</ContentPage>

//后台代码,部分类,继承自ContentPage
public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }
}

 

2、x:ClassModifier。指定当前XAML文件的编译结果类具有怎样的访问级别。必须与对应的后台代码,具有相同的访问级别。

//指定访问级别为public,比较少使用
<ContentPage
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="MauiApp7.MainPage"
    x:ClassModifier="public">
</ContentPage>

//后台代码也是public
public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }
}

 

3、x:Name。XAML元素本质上是对象,在XAML文件中,通过x:Name来指定对象的变量名称。

//将Lable对象,命名为lable
//等效C#代码:var lable = new Lable{Text = "HelloWorld"};
<ContentPage
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="MauiApp7.MainPage"

    <StackLayout>
        <Label x:Name="lable" Text="HelloWorld"/>
        <Button Text="ChangeLabelText" Clicked="Button_Clicked"/>
    </StackLayout>
</ContentPage>

//后台代码,点击事件的响应中,使用“lable.Text”引用对象属性,并赋值
public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }
    private void Button_Clicked(object sender, EventArgs e)
    {
        lable.Text = "HiChina";
    }
}

 

4、x:FieldModifier。XAML文件中,除根元素外,其它元素在C#代码层面,本质上就是字段。类似于x:ClassModifier,前者指定类的访问级别,后者指定字段的访问级别。

//默认为internal,定义为public,这样在其它项目中,也可以访问这个对象
<StackLayout>
    <Label x:Name="lable" x:FieldModifier="public" Text="定义访问级别" />
</StackLayout>

 

5、x:Key。资源字典是Dictionary<string,object>集合类型,每个集合的项目,都可以使用x:Key来定义键名。其它元素引用这个资源时,通过键名来引用。

//资源字典中,添加键值对字典,键名使用x:Key来定义
//{StaticResource Key=ChinaHi}可以简写为{StaticResource ChinaHi}
//因为Key为StaticResource的内容属性,所以可以省略
<ContentPage
    x:Class="MauiApp7.MainPage"
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">

    <ContentPage.Resources>
        <x:String x:Key="ChinaHi">吃了吗</x:String>
    </ContentPage.Resources>
    <StackLayout>
        <Label
            x:Name="lable"
            x:FieldModifier="public"
            Text="{StaticResource Key=ChinaHi}" />
    </StackLayout>

</ContentPage>

 

 

6/7、x:Arguments、x:FactoryMethod。XAML中,每定义一个元素标签,本质上就是创建一个对象。在C#代码层面,创建对象的方式,除了属性赋值外,还有两个方法,一是构造函数初始化;二是工厂函数初始化。通过x:Arguments,可以给构造函数传递参数,而x:FactoryMethod可以调用工厂方法,并结合x:Arguments为工厂方法传递参数。 

//Color类定义了多个构造函数和工厂函数,以此为例来说明x:Arguments和x:FactoryMethod的使用
//调用一个参数的构造方法来创建Color对象
<BoxView HeightRequest="100" WidthRequest="100">
    <BoxView.Color>
        <Color>
            <x:Arguments>
                <x:Single>0.8</x:Single>
            </x:Arguments>
        </Color>
    </BoxView.Color>
</BoxView>

//调用三个参数的构造方法来创建Color对象
<BoxView HeightRequest="100" WidthRequest="100">
    <BoxView.Color>
        <Color>
            <x:Arguments>
                <x:Single>0.65</x:Single>
                <x:Single>0.8</x:Single>
                <x:Single>0.75</x:Single>
            </x:Arguments>
        </Color>
    </BoxView.Color>
</BoxView>

//调用工厂函数FromHsla,创建Color对象
<BoxView HeightRequest="150" WidthRequest="150">
    <BoxView.Color>
        <Color x:FactoryMethod="FromHsla">
            <x:Arguments>
                <x:Double>0.23</x:Double>
                <x:Double>0.42</x:Double>
                <x:Double>0.69</x:Double>
                <x:Double>0.7</x:Double>
            </x:Arguments>
        </Color>
    </BoxView.Color>
</BoxView>

 

8、x:TypeArguments泛型类型,在实例化时,需要指明泛型参数的类型,x:TypeArguments的主要作用就是指定对象的泛型类型。

//泛型参数为简单类型
//引入List<T>的命名空间xmlns:scg="clr-namespace:System.Collections.Generic;assembly=netstandard"
<CollectionView>
    <CollectionView.ItemsSource>
        <scg:List x:TypeArguments="x:String">
            <x:String>abc</x:String>
            <x:String>efg</x:String>
            <x:String>hij</x:String>
        </scg:List>
    </CollectionView.ItemsSource>
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <Label Text="{Binding}" />
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

//泛型参数为复杂类型
<ContentPage
    x:Class="MauiApp7.MainPage"
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:models="clr-namespace:MauiApp7.Models"
    xmlns:scg="clr-namespace:System.Collections.Generic;assembly=netstandard">

    <StackLayout>
        <CollectionView>
            <CollectionView.ItemsSource>
                <scg:List x:TypeArguments="models:Employee">
                    <models:Employee Name="张三" Age="20" />
                    <models:Employee Name="李四" Age="30" />
                    <models:Employee Name="王五" Age="40" />
                </scg:List>
            </CollectionView.ItemsSource>
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <StackLayout>
                        <Label
                            Grid.Row="0"
                            Grid.Column="1"
                            Text="{Binding Name}" />
                        <Label
                            Grid.Row="1"
                            Grid.Column="1"
                            Text="{Binding Age}" />
                    </StackLayout>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
    </StackLayout>

</ContentPage>

 

9、x:Datatype。XAML的绑定在运行时解析,造成两个问题:一是无法对绑定进行编译时校验,要到运行时才能发现;二是存在性能损耗。x:Datatype的作用,就是在编译时,明确绑定上下文的类型,可以明显改善以上两个问题,称之为编译时绑定。在XAML元素属性上声明x:Datatype后,绑定作用会向下延伸到子元素。所以一般情况下,x:Datatype和BindingContext定义在同一层级的元素上,但也可以在视觉树的任一层级声明。除了和BindingContext一起使用外,x:Datatype还可作用于DataTemplate,使集合绑定也变成编译时。

//BindingContext和x:Datatype都定义在ContentPage元素上
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:DataBindingDemos"
             x:Class="MauiApp7.MainPage"
             x:DataType="local:HslColorViewModel">

    <ContentPage.BindingContext>
        <local:HslColorViewModel Color="Sienna" />
    </ContentPage.BindingContext>


    <StackLayout Margin="10, 0">
        <Label Text="{Binding Name}" />
        <Slider Value="{Binding Hue}" />
        <Label Text="{Binding Hue, StringFormat='Hue = {0:F2}'}" />
        <Slider Value="{Binding Saturation}" />
        <Label Text="{Binding Saturation, StringFormat='Saturation = {0:F2}'}" />
        <Slider Value="{Binding Luminosity}" />
        <Label Text="{Binding Luminosity, StringFormat='Luminosity = {0:F2}'}" />
    </StackLayout> 

</ContentPage>


//在DataTemplate中使用
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:DataBindingDemos"
             x:Class="MauiApp7.MainPage"
             x:DataType="local:HslColorViewModel">

    <Grid>
        <ListView ItemsSource="{x:Static local:NamedColor.All}">
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="local:NamedColor">
                    <ViewCell>
                        <StackLayout Orientation="Horizontal">
                            <BoxView Color="{Binding Color}"/>
                            <Label Text="{Binding FriendlyName}"/>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>    

</ContentPage>

 

 

 

 

 

二、标记扩展详见标记扩展章节

  • x:Array。将数组赋值给属性
  • x:Null。将Null值赋值给属性
  • x:Type。将类型值赋值给属性
  • x:Static。将静态成员赋值给属性

 

 

三、指令

x:Code用于在XAML文档中写C#后台代码,x:XData用于引入XMLDataProvider提供的数据,都很少使用。这些工作,都应该在后台代码中完成,可以略过。

 

 

四、类型

定义资源和传递参数时,可以通过x命名空间进行类型申明,如<x:String x:Key="SayHi">HelloWorld</x:String>,等效于C#代码string SayHi = "HelloWorld"。这些类型支持,与.NET支持的基本类型一一对应。我们也可以通过引用.NET的System命名空间,实现同样功能,如<sys:String x:Key="SayHi">HelloWorld</sys:String>。目前x命名空间,提供了13个类型支持,可以分一下组:

  • 整数:x:Byte、x:Int16、x:Int32、x:Int64
  • 浮点数:x:Single(相当于float)、x:Double、x:Decimal
  • 布尔:x:Boolean
  • 字符:x:Char
  • 字符串:x:String
  • 日期时间:x:DateTime、x:TimeSpan
  • 对象:x:Object 
//在资源字典中申明类型变量
<ContentPage.Resources>
    <x:String x:Key="eSayHi">How are you!</x:String>
    <x:String x:Key="cSayHi">吃了吗!</x:String>
</ContentPage.Resources>
<Label Text="{StaticResource eSayHi}" />


//为构造函数传递参数
//下例中Color类有多个构造函数重载,根据传入参数,调用不同的构造函数
//使用x:Arguments传递参数
<BoxView HeightRequest="150">
    <BoxView.Color>
        <Color>
            <x:Arguments>
                <x:Single>0.9</x:Single>
            </x:Arguments>
        </Color>
    </BoxView.Color>
</BoxView>
<BoxView HeightRequest="150">
    <BoxView.Color>
        <Color>
            <x:Arguments>
                <x:Single>0.25</x:Single>
                <x:Single>0.5</x:Single>
                <x:Single>0.75</x:Single>
            </x:Arguments>
        </Color>
    </BoxView.Color>
</BoxView>

 

标签:1.4,代码,xmlns,XAML,元素,编译,类型,public
From: https://www.cnblogs.com/functionMC/p/16901849.html

相关文章

  • 【Xaml】WPF中Popup 实现类智能感知
    首先要做的事情就是定义一个popup来显示我们需要展示的东西<Popupx:Name="ConfigPopup"Height="auto"Width="150"StaysOpen="False"Placement="Bottom"IsOpen="Fal......
  • 在WPF中将XAML表格文档转换为PDF文件导出
    摘要编写文档模板页面1、新建Page页面,将顶部节点更改为FlowDocument,后台代码不需要,可直接删掉2、实现一个表格页面直接上代码,自己看,其中需要注意的是,如果非静态页面......
  • MAUI新生1.3-XAML语法基础:标记扩展原理
    标记扩展,本质上是IMarkupExtension或者IMarkupExtension<T>接口的实现类。这两个接口,均定义了ProvideValue方法。注意,IMarkupExtension<T>继承自IMarkupExtension,如果定义......
  • MAUI新生1.2-XAML语法基础:标记扩展{}
    标记扩展,使属性值可以引用其他源的值或对象,比如引用资源字典、引用其它控件的属性值、绑定ViewModel类属性值等。标记扩展的语法有大括号{}和尖括号<>两种方式,但x:Array比......
  • C++中sort函数、1.4最长公共子串
    sort()即为用来排序的函数,它根据具体情况使用不同的排序方法,效率较高。sort在实现时避免了经典快速排序中可能出现的会导致实际复杂度退化到O(n2)的极端情况。使用sort()......
  • vue.js3:用html2canvas把html转canvas图片([email protected] / [email protected])
    一,安装html2canvas1,官网:https://html2canvas.hertzen.com/如图:代码站:https://github.com/niklasvh/html2canvas2,通过npm安装liuhongdi@lhdpc:/data......
  • WPF中的XAML学习方式
    XMLXAML完全符合XML的标准XML是很容易学习的,要先学会元素、属性、命名空间等语法,然后再看XAML语句的时候就不感到陌生了。XAML语法和C#的关联元素一般都对应......
  • MAUI新生-XAML语法基础:语法入门Element&Property&Event&Command
    一、XAML(MAUI的XAML)和HTML两者相似,都是标签语言(也叫标记)组成的树形文档。每个标签元素,可视为一个对象,通过“键=值”形式的标签属性(Attribute),为对象的属性(Property)、事件......
  • KVM/QEMU(virt-manager)使用iso镜像安装macOS bigsur 11.4
    参考:https://blog.csdn.net/u012332816/article/details/1221868991.背景本人没有mac电脑,但是需要在macOS上做一些事情,原来我在VMWareWorkstations和VirtualBox......
  • 【XAML】 WindowChrome 自定义窗体样式
    导读【XAML】WindowChrome的功能详解背景 WPF有两种主流的自定义Window窗体的方案,都各有缺点。方法一、缺点《WPF编程宝典》介绍了使用WindowStyle="None"和AllowsT......