WindowsPhone XAML语法详解
最后更新于:2022-04-01 11:30:29
本文系本站原创,欢迎转载! 转载请注明出处:
[http://blog.csdn.net/mr_raptor/article/details/7227260](http://blog.csdn.net/mr_raptor/article/details/7227260)[](http://blog.csdn.net/mr_raptor/article/details/7212155)
**XAML** 是一种声明性标记语言。XAML 简化了为 .NET Framework 应用程序创建 UI 的过程。您可以在声明性 XAML 标记中创建可见的 UI 元素,然后使用代码隐藏文件(通过分部类定义与标记相连接)将 UI 定义与运行时逻辑相分离。XAML 直接以程序集中定义的一组特定后备类型表示对象的实例化。 XAML 实现了一个工作流,通过此工作流,各方可以采用不同的工具来处理应用程序的 UI 和逻辑。
关注原创:[http://blog.csdn.net/mr_raptor/article/details/7227260](http://blog.csdn.net/mr_raptor/article/details/7227260)[](http://blog.csdn.net/mr_raptor/article/details/7212155)
以文本表示时,XAML 文件是通常具有 .xaml 扩展名的 XML 文件。 可通过任何 XML 编码对文件进行编码,但通常编码为 UTF-8。
特点:
1. 具有 .xaml 扩展名的 XML 文件,格式和XML一样
2.在XAML中定义的元素其实是程序集中定义的类型对象
3.每一个WP7应用程序中的.xaml文件,都有一个与之对应的代码隐藏文件(XAML文件名+.cs)
关注原创:[http://blog.csdn.net/mr_raptor/article/details/7227260](http://blog.csdn.net/mr_raptor/article/details/7227260)[](http://blog.csdn.net/mr_raptor/article/details/7212155)
**XAML文件与代码隐藏文件**
由于XAML文件只负责用于表现UI,而UI对应的控制逻辑通常是由与之对应的代码隐藏文件来负责的。在WP7应用程序中,每一个WP7应用程序中的.xaml文件,都有一个与之对应的代码隐藏文件(XAML文件名+.cs),例如:MainPage.xaml对应的代码隐藏文件名字为MainPage.xaml.cs。二者通过XAML文件根元素中x:Class前缀进行连接指定。当UI上的控件产生了事件之后,会通过x:Class前缀中指定的代码隐藏文件命名空间和类名,找到UI处理逻辑,从而进行事件处理(那当然,还要在控件的事件属性中指定事件处理方法例如下面代码:
在根元素x:Class中指定了命名空间和类名为MyTes.MainPage,在Button元素中指定了按钮处理方法Btn_Click,当用户按下按钮时,自动回调代码隐藏文件MainPage.xaml.cs中的Btn_Click事件处理方法。
MainPage.xaml文件
~~~
<phone:PhoneApplicationPage
x:Class="MyTest.MainPage"
...>
<Button Click="Btn_Click" />
</phone:PhoneApplicationPage>
~~~
MainPage.xaml.cs代码隐藏文件
~~~
namespace MyTest
{
public partial class MainPage : PhoneApplicationPage
{
private void Btn_Click (object sender, RoutedEventArgs e)
{
....
}
}
~~~
关注原创:[http://blog.csdn.net/mr_raptor/article/details/7227260](http://blog.csdn.net/mr_raptor/article/details/7227260)[](http://blog.csdn.net/mr_raptor/article/details/7212155)
**属性语法**
对象的属性通常可表示为对象元素的特性。属性语法命名在属性语法中设置的属性,后跟赋值运算符 (=)。属性的值始终以包含在引号中的字符串的形式进行指定。
属性语法是最简单有效的属性设置语法,并且对于曾使用过标记语言的开发人员而言在使用中是最直观的语法。例如,以下标记将创建一个具有红色文本和蓝色背景的按钮,还将创建指定为 Content 的显示文本。
~~~
<Button Background="Blue" Foreground="Red" Content="This is a button"/>
~~~
关注原创:[http://blog.csdn.net/mr_raptor/article/details/7227260](http://blog.csdn.net/mr_raptor/article/details/7227260)[](http://blog.csdn.net/mr_raptor/article/details/7212155)
### 属性对象元素语法
对于对象元素的某些属性,属性语法是不可能实现的,因为无法在属性语法的引号和字符串限制内充分地表达提供属性值所必需的对象或信息。对于这些情况,可以使用另一个语法,即属性对象元素语法。
属性元素对象开始标记的语法为 <*类型名称*.*属性名称*>。 通常,该标记的内容是类型的一个对象元素,属性会将该元素作为其值。指定内容之后,必须用一个结束标记结束属性元素。结束标记的语法为 </*类型名称*.*属性名称*>。
~~~
<Button>
<Button.Background>
<SolidColorBrush Color="Blue"/>
</Button.Background>
<Button.Foreground>
<SolidColorBrush Color="Red"/>
</Button.Foreground>
<Button.Content>
This is a button
</Button.Content>
</Button>
~~~
关注原创:[http://blog.csdn.net/mr_raptor/article/details/7227260](http://blog.csdn.net/mr_raptor/article/details/7227260)[](http://blog.csdn.net/mr_raptor/article/details/7212155)
**内容属性**
如果一个类的内容属性为该类中的唯一一个内容属性,对象元素的子元素可以用于设置该内容属性的值。换言之,仅对内容属性而言,您可以在 XAML 标记中设置该属性时省略属性元素,并在标记中生成更直观的父级/子级形式。
~~~
<Border>
<TextBox Width="300"/>
</Border>
~~~
当然,你也可以显示的的标明,设置了元素的内容属性为子元素。
~~~
<Border>
<Border.Child>
<TextBox Width="300"/>
</Border.Child>
</Border>
~~~
**关注原创:[http://blog.csdn.net/mr_raptor/article/details/7227260](http://blog.csdn.net/mr_raptor/article/details/7227260)[](http://blog.csdn.net/mr_raptor/article/details/7212155)**
集合语法
XAML 语言包含一些优化,可以生成可读性更好的标记。其中的一项优化是:如果某个特定属性采用集合类型,则您在标记中声明为该属性的值内的子元素的项将成为集合的一部分。在这种情况下,子对象元素的集合是设置为集合属性的值。
下面的示例演示为 GradientStops 属性设置值的集合语法:
~~~
<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.0" Color="Red" />
<GradientStop Offset="1.0" Color="Blue" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
~~~
关注原创:[http://blog.csdn.net/mr_raptor/article/details/7227260](http://blog.csdn.net/mr_raptor/article/details/7227260)[](http://blog.csdn.net/mr_raptor/article/details/7212155)
### XAML 根元素和 XAML 命名空间
一个 XAML 文件只能有一个根元素,这样才能同时成为格式正确的 XML 文件和有效的 XAML 文件。例如每个WindowsPhone的应用程序XAML都只有一个<phone:PhoneApplicationPage></ phone:PhoneApplicationPage > 根元素。
根元素还包含特性 xmlns , xmlns:x,xmlns:phone,如下表所示。
<table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top"><p align="center"><strong>元素名</strong></p></td><td valign="top"><p align="center"><strong>释义</strong></p></td></tr><tr><td valign="top"><p><phone:PhoneApplicationPage </p></td><td valign="top"><p>根元素的开始对象元素 </p></td></tr><tr><td valign="top"><p>xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" </p></td><td valign="top"><p>默认 XAML 命名空间 </p></td></tr><tr><td valign="top"><p>xmlns:phone="clr-namespace:Microsoft.Phone.Controls;</p><p>assembly=Microsoft.Phone"</p></td><td valign="top"><p>命名空间phone引用了程序集Microsoft.Phone中的命名空间 </p></td></tr><tr><td valign="top"><p>xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" </p></td><td valign="top"><p>XAML 语言 XAML 命名空间 </p></td></tr><tr><td valign="top"><p>x:Class="ExampleNamespace.ExampleCode" </p></td><td valign="top"><p>分部类声明,它将标记连接到为分部类定义的代码隐藏文件 </p></td></tr><tr><td valign="top"><p>> </p></td><td valign="top"><p>根的对象元素的末尾。由于该元素包含子元素,因此对象未结束 </p></td></tr></tbody></table>
这些特性向 XAML 处理器指明哪些 XAML 命名空间包含标记将要作为元素引用的后备类型的类型定义。xmlns 特性明确指示默认的 XAML 命名空间。 在默认的 XAML 命名空间中,可以不使用前缀指定标记中的对象元素。对于大多数 WP7应用程序方案中,默认的 XAML 命名空间均映射到为 WPF 命名空间 http://schemas.microsoft.com/winfx/2006/xaml/presentation。xmlns:x 特性指示另外一个 XAML 命名空间,该命名空间映射 XAML 语言命名空间 http://schemas.microsoft.com/winfx/2006/xaml。
使用 xmlns 定义用法范围和名称范围映射的做法符合 XML 1.0 规范。 XAML 名称范围与 XML 名称范围的不同仅在于:XAML 名称范围还包含有关进行类型解析和分析 XAML 时名称范围的元素如何受类型支持的信息。
请注意,只有在每个 XAML 文件的根元素上, xmlns 特性才是绝对必需的。 xmlns 定义将适用于根元素的所有子代元素(此行为也符合 xmlns 的 XML 1.0 规范。)同时允许根以下的其他元素上具有 xmlns 特性,这些特性将适用于定义元素的任何子代元素。 但是,频繁定义或重新定义 XAML 命名空间可能会导致 XAML 标记样式难以阅读。
其 XAML 处理器的实现包括可识别核心程序集的基础结构。因此,为了引用来自WP7程序集中的 XAML 元素,只需将默认 XAML 命名空间声明为默认 xmlns。
**x: 前缀**
在上面的根元素示例中,前缀 x: 用于映射 XAML 命名空间 http://schemas.microsoft.com/winfx/2006/xaml,该命名空间是支持 XAML 语言构造的专用 XAML 命名空间。 在这整个 SDK 的项目模板、示例以及文档中,此 x: 前缀用于映射该 XAML 命名空间。 XAML 语言的 XAML 命名空间包含多个将在 XAML 中频繁用到的编程构造。下面列出了将用到的最常见的x: 前缀编程构造:
- [x:Key](http://127.0.0.1:47873/help/1-4812/ms.help?method=page&id=1985CD45-F197-42D5-B75E-886ADD64B248&product=VS&productVersion=100&topicVersion=100&locale=ZH-CN&topicLocale=ZH-CN):为 ResourceDictionary中的每个资源设置唯一的键。 在典型的 WP7 应用程序标记中的所有 x: 用法中, x:Key 将可能占到 90%。
- [x:Class](http://127.0.0.1:47873/help/1-4812/ms.help?method=page&id=BC4A3D8E-76E2-423E-A5D1-159A023E82EC&product=VS&productVersion=100&topicVersion=100&locale=ZH-CN&topicLocale=ZH-CN):为 XAML 页提供“**代码隐藏的类”**指定 CLR 命名空间和类名,也就是说每个XAML文件后面都有一个与之对应的代码隐藏类(其实就是对应的XAML文件名+.cs)。 必须具有这样一个类才能支持每个 WP7 编程模型的代码隐藏,而正是因为如此,即使没有资源,也几乎总是能看到映射的 x:。
- [x:Name](http://127.0.0.1:47873/help/1-4812/ms.help?method=page&id=B7E61222-E8CF-48D2-ACD0-6DF3B7685D48&product=VS&productVersion=100&topicVersion=100&locale=ZH-CN&topicLocale=ZH-CN):经过XAML处理器处理所有对象元素后,为XAML代码中的实例指定运行时对象名称。 通常,您将为 [x:Name](http://127.0.0.1:47873/help/1-4812/ms.help?method=page&id=B7E61222-E8CF-48D2-ACD0-6DF3B7685D48&product=VS&productVersion=100&topicVersion=100&locale=ZH-CN&topicLocale=ZH-CN) 经常使用 WP7 定义的等效属性。 此类属性特定映射到 CLR 后备属性,因此更便于进行应用程序编程,在应用程序编程中,您经常使用运行时代码从初始化的 XAML 中查找命名元素。最常见的此类属性是 [FrameworkElement .Name ](http://127.0.0.1:47873/help/1-4812/ms.help?method=page&id=P%3ASYSTEM.WINDOWS.FRAMEWORKELEMENT.NAME&product=VS&productVersion=100&topicVersion=100&locale=ZH-CN&topicLocale=ZH-CN)。
- [x:Static](http://127.0.0.1:47873/help/1-4812/ms.help?method=page&id=056AEE79-7CDD-434F-8174-DFC856CAD343&product=VS&productVersion=100&topicVersion=100&locale=ZH-CN&topicLocale=ZH-CN):启用一个返回静态值的引用,该静态值只能是一个 XAML 兼容属性。
- [x:Type](http://127.0.0.1:47873/help/1-4812/ms.help?method=page&id=E0E0CE6F-E873-49C7-8AD7-8B840EB353EC&product=VS&productVersion=100&topicVersion=100&locale=ZH-CN&topicLocale=ZH-CN):根据类型名称构造一个 [Type](http://127.0.0.1:47873/help/1-4812/ms.help?method=page&id=T%3ASYSTEM.TYPE&product=VS&productVersion=100&topicVersion=100&locale=ZH-CN&topicLocale=ZH-CN) 引用。 它用于指定采用 [Type](http://127.0.0.1:47873/help/1-4812/ms.help?method=page&id=T%3ASYSTEM.TYPE&product=VS&productVersion=100&topicVersion=100&locale=ZH-CN&topicLocale=ZH-CN)(例如 [Style .TargetType ](http://127.0.0.1:47873/help/1-4812/ms.help?method=page&id=P%3ASYSTEM.WINDOWS.STYLE.TARGETTYPE&product=VS&productVersion=100&topicVersion=100&locale=ZH-CN&topicLocale=ZH-CN))的特性,但属性经常具有本机的字符串到 [Type](http://127.0.0.1:47873/help/1-4812/ms.help?method=page&id=T%3ASYSTEM.TYPE&product=VS&productVersion=100&topicVersion=100&locale=ZH-CN&topicLocale=ZH-CN) 的转换功能,因此使用[x:Type](http://127.0.0.1:47873/help/1-4812/ms.help?method=page&id=E0E0CE6F-E873-49C7-8AD7-8B840EB353EC&product=VS&productVersion=100&topicVersion=100&locale=ZH-CN&topicLocale=ZH-CN) 标记扩展用法是可选的。
### XAML 中的自定义前缀和自定义类型
对于自定义程序集或 PresentationCore、PresentationFramework 和 WindowsBase 的 WP7 核心以外的程序集,可以将该程序集指定为自定义 **xmlns** 映射的一部分,就可以在 XAML 中引用该程序集中的类型。
下面是一个说明自定义前缀如何在 XAML 标记中工作的基本示例。前缀 custom 在根元素标记中定义,并映射为随应用程序一同打包的一个特定程序集。 此程序集包含 NumericUpDown 类型。 通过使用该前缀,可以声明此NumericUpDown 控件的实例对象元素,当 XAML 分析器解析到当前元素时,通过前缀custom的声明中指定的命名空间,可找到包含该类型的 XAML 命名空间,从而找到包含自定义类型的程序集的位置。
~~~
<phone:PhoneApplicationPage
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" **xmlns:custom="clr-namespace:NumericUpDownCustomControl;assembly=CustomLibrary"**
>
<StackPanel Name="LayoutRoot">
<custom:NumericUpDown Name="numericCtrl1" Width="100" Height="60"/>
...</StackPanel>
</phone:PhoneApplicationPage>
~~~
本文系本站原创,欢迎转载! 转载请注明出处:
[http://blog.csdn.net/mr_raptor/article/details/7227260](http://blog.csdn.net/mr_raptor/article/details/7227260)[](http://blog.csdn.net/mr_raptor/article/details/7212155)