本文系本站原創,歡迎轉載! 轉載請注明出處:
[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)
?
- 前言
- WindowsPhone之我見
- 整理Windows Phone 7教程(很全面)
- WindowsPhone XAML語法詳解
- WindowsPhone控件詳解及引用外部控件Silverlight Toolkit
- Silverlight for Windows Phone Toolkit升級說明
- WindowsPhone統計圖表控件 - 第三方控件visifire
- WindowsPhone第三方控件-Resco MobileForms Toolkit 2012
- Windows Phone 7 處理休眠和墓碑的恢復
- WindowsPhone自定義控件詳解(一) - 控件類庫分析
- WindowsPhone自定義控件詳解(二) - 模板類庫分析
- WindowsPhone自定義控件詳解(三) - 實戰:自定義帶水印的PasswordBox控件,WatermarkedPasswordBox
- WindowsPhone下拉刷新控件 - PullRefreshListBox(一)