版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、Xaml 概述(wpf)發(fā)送反饋本主題介紹XAML語言的功能,并演示如何使用XAML編寫 Windows PresentationFoundation (WPF)應用程序。本主題專門介紹WPF實現(xiàn)的 XAML。XAML本身是一個比WPF大的語言概念。本主題包括下列各節(jié)。 什么是XAML ? XAML語法概述 XAML中的大小寫和空白 標記擴展 類型轉換器 XAML 根元素和 XAML 命名空間 XAML中的自定義前綴和自定義類型 事件和XAML代碼隱藏 XAML命名元素 附加屬性和附加事件 基類型和XAML XAML安全性 從代碼中加載XAML 接下來的內(nèi)容, 相關主題什么是XAML ?XAM
2、L是一種聲明性標記語言。如同應用于 .NET Framework編程模型一樣,XAML簡化了為.NET Framework應用程序創(chuàng) 建UI的過程。您可以在聲明性 XAML標記中創(chuàng)建可見的 UI元素,然后使用代碼隱藏文件(通過分部類定義與標記相連接) 將UI定義與運行時邏輯相分離。XAML直接以程序集中定義的一組特定后備類型表示對象的實例化。這與大多數(shù)其他標記語言不同,后者通常是與后備類型系統(tǒng)沒有此類直接關系的解釋語言。XAML實現(xiàn)了一個工作流,通過此工作流,各方可以采用不同的工具來處理應用程序的 UI和邏輯。以文本表示時,XAML文件是通常具有.xaml擴展名的XML文件??赏ㄟ^任何 XML
3、編碼對文件進行編碼,但通常編碼為UTF-8。下面的示例演示如何創(chuàng)建作為 UI 一部分的按鈕。此示例的目的僅在于供您初步了解XAML是如何表示常用 UI編程形式的(它不是一個完整的示例)。XAML<StackPanel><Button Content= "Click Me" /> </StackPanel>XAML語法概述下面的章節(jié)介紹 XAML語法的基本形式,并提供一個簡短的標記示例。這些章節(jié)并不提供每個語法形式的完整信息,例如這 些語法如何在后備類型系統(tǒng)中表示。有關本主題中介紹的每種語法形式在XAML語法中的詳情的更多信息,請參見XAM
4、L語法詳述。如果您以前熟悉XML語言,則下面幾節(jié)中的很多材料對您而言都是基礎知識。這是XAML的其中一個基本設計原則的結果。XAML語言定義它自己的概念,但這些概念在 XML語言和標記形式內(nèi)發(fā)揮作用。XAML對象元素對象元素通常聲明類型的實例。該類型在為以XAML為語言的技術提供后備類型的程序集中定義。對象元素語法始終以左尖括號 (<)開頭,后跟要創(chuàng)建實例的類型的名稱。(該名稱可能包含前綴,前綴的概念會在后面解釋。) 在此之后,您可以選擇聲明該對象元素的特性。要完成對象元素標記,請以右尖括號(>)結尾。您也可以使用不含任何內(nèi)容的自結束形式,方法是用一個正斜杠后接一個右尖括號(/&g
5、t;)來完成標記。例如,請再次查看前面演示的標記代碼段:XAML打印<StackPanel><Button Content= "Click Me" /></StackPanel>此示例指定了兩個對象元素:<StackPanel>(含有內(nèi)容,后面有一個結束標記)和 Button ./>(自結束形式,包含幾個特性)。 對象元素StackPanel 和Button 各映射到一個類名,這些類由 WPF定義并且是 WPF程序集的一部分。 指定 對象元素標記時會創(chuàng)建一條 XAML處理指令來創(chuàng)建一個新實例。每個實例都是在分析和加載XA
6、ML時通過調(diào)用基礎類型的默認構造函數(shù)來創(chuàng)建的。特性語法(屆性)對象的屬性通??杀硎緸閷ο笤氐奶匦?。特性語法命名在特性語法中設置的屬性,后跟賦值運算符(=)。特性的值始終以包含在引號中的字符串的形式進行指定。特性語法是最簡單有效的屬性設置語法,并且對于曾使用過標記語言的開發(fā)人員而言在使用中是最直觀的語法。例如,以下標 記將創(chuàng)建一個具有紅色文本和藍色背景的按鈕,還將創(chuàng)建指定為Content 的顯示文本。XAML打印<Button Background= "Blue" Foreground= "Red" Content= "This is a
7、 button" />屆性元素語法對于對象元素的某些屬性,特性語法是不可能實現(xiàn)的,因為無法在特性語法的引號和字符串限制內(nèi)充分地表達提供屬性值所必 需的對象或信息。對于這些情況,可以使用另一個語法,即屬性元素語法。屬性元素開始標記的語法為 類型名稱.屬性名稱。通常,該標記的內(nèi)容是類型的一個對象元素,屬性會將該元素作為其值。指定內(nèi)容之后,必須用一個結束標記結束屬性元素。結束標記的語法為</類型名稱.屬性名稱>。如果可以使用特性語法,那么使用特性語法通常更為方便,且能夠實現(xiàn)更為精簡的標記,但這通常只是一個風格的問題,而不屬于技術限制。下面的示例演示了在前面的特性語法示例中
8、設置的相同屬性,但這次對Button的所有屬性使用了屬性元素語法。XAML打印<Button><Button.Background><SolidColorBrush Color="Blue" /></Button.Background><Button.Foreground><SolidColorBrush Color="Red" /></Button.Foreground><Button.Content>This is a button</Button.
9、Content></Button>集合語法XAML語言包含一些優(yōu)化,可以生成可讀性更好的標記。其中的一項優(yōu)化是:如果某個特定屬性采用集合類型,則您在標記中 聲明為該屬性的值內(nèi)的子元素的項將成為集合的一部分。在這種情況下,子對象元素的集合是設置為集合屬性的值。下面的示例演示為GradientStops屬性設置值的集合語法:XAML打印<LinearGradientBrush><LinearGradientBrush.GradientStops><!- no explicit new GradientStopCollection,parser kno
10、wshow to find or create -><GradientStop Offset="0.0"Color="Red" /><GradientStop Offset="1.0"Color="Blue" /></LinearGradientBrush.GradientStops> </LinearGradientBrush>XAML內(nèi)容屆性XAML指定了一個語言功能,通過該功能,一個類可以指定它的一個且僅一個屬性為XAML內(nèi)容屬性。該對象元素的子元素用于設
11、置該內(nèi)容屬性的值。換言之,僅對內(nèi)容屬性而言,您可以在XAML標記中設置該屬性時省略屬性元素,并在標記中生成更直觀的父級/子級形式。例如,Border指定內(nèi)容屬性Child。系統(tǒng)處理下面兩個Border元素的方式相同。 第一個元素利用了內(nèi)容屬性語法而省略 了 Border.Child屬性元素。第二個元素顯式標明 Border.Child。XAMLI打印<Border><TextBox Width= "300" /></Border><!-explicit equivalent-><Border><Border.
12、Child><TextBox Width= "300" /></Border.Child></Border>作為XAML語言的規(guī)則,XAML內(nèi)容屬性的值必須完全在該對象元素的其他任何屬性元素之前或之后指定。例如,下面的標記無法進行編譯:打印<Button >I am a<Button.Background >Blue </ Button.Background > blue button </ Button >有關XAML內(nèi)容屬性的此項限制的更多信息,請參見 XAML語法詳述的“XAML
13、內(nèi)容屬性”一節(jié)。文本內(nèi)容有少量XAML元素可直接將文本作為其內(nèi)容來處理。若要實現(xiàn)此功能,必須滿足以下條件之一: 類必須聲明一個內(nèi)容屬性,并且該內(nèi)容屬性必須是可賦值給字符串的類型(該類型可以是Object)。例如,任何ContentControl都將Content用作其內(nèi)容屬性,并且其類型為 Object,這樣就支持實際的 ContentControl (例 如,Button)上的如下用法: <Button>Hello</Button> 。 類型必須聲明一個類型轉換器,該類型轉換器將文本內(nèi)容用作其初始化文本。例如, <Brush>Blue</Brush&
14、gt; 。這 種情況實際上并不常見。 類型必須為已知的 XAML語言基元。內(nèi)容屆性和集合語法組合請看以下示例:XAML打印<StackPanel><Button>First Button</Button><Button>Second Button</Button></StackPanel>此例中,每個Button都是StackPanel的一個子元素。 這是一個簡單直觀的標記,其中出于兩個不同的原因省略了兩個標記。省略的 StackPanel.Children 屬性元素:StackPanel從 Panel派生。Panel將
15、Panel .Children 定義為其 XAML 內(nèi)容屬 性。 省略的 UIElementCollection 對象元素:Panel .Children 屬性采用類型 UlElementCollection,該類型實現(xiàn) IList。根據(jù) 處理集合(例如IList)的XAML規(guī)則,集合的元素標記可以省略。(在這種情況下,UIElementCollection實際無法實例化,因為它沒有公開默認構造函數(shù),這就是UIElementCollection對象元素以注釋形式出現(xiàn)的原因。)XAML打印<StackPanel><StackPanel.Children><!-<
16、;UIElementCollection>-><Button>First Button</Button><Button>Second Button</Button><!-</UIElementCollection>-></StackPanel.Children> </StackPanel> 特性語法(事件)特性語法還可用于事件成員,而不僅限于屬性成員。在這種情況下,特性的名稱為事件的名稱。在XAML事件的 WPF實現(xiàn)中,特性的值是實現(xiàn)該事件的委托的處理程序的名稱。例如,以下標記將Clic
17、k事件的一個處理程序指定給在標記中創(chuàng)建的 Button :XAML打印<Pagexmlns= " ntation"xmlns:x= " x:Class= "ExampleNamespace.ExamplePage" > <Button Click= "Button_Click" >Click Me!</Button></Page>除此特性語法示例外,還有更多關于WPF中的事件和XAML的內(nèi)容。例如,您可能希望了解此處引用的 ClickHandler 表示什么,以及它是如何定義的
18、。 這將在本主題中后面的事件和XAML代碼隱藏一節(jié)中解釋。XAML 中的大小寫和空白XAML通常區(qū)分大小寫。出于解析后備類型的目的,WPF XAML按照CLR區(qū)分大小寫的相同規(guī)則區(qū)分大小寫。按名稱與程序集中的基礎類型進行比較或者與類型的成員進行比較時,對象元素、屬性元素和特性名稱均必須使用區(qū)分大小寫的形式指定。XAML語言關鍵字和基元也區(qū)分大小寫。值并不總是區(qū)分大小寫。值是否區(qū)分大小寫將取決于與采用該值的屬性關聯(lián)的類型轉 換器行為,或取決于屬性值類型。例如,采用Boolean類型的屬性可以采用true或True作為等效值,但只是因為將字符串轉換為Boolean的本機 WPF XAML分析器類型
19、轉換已經(jīng)允許將這些值作為等效值。WPF XAML處理器和序列化程序將忽略或刪除所有無意義的空白,并規(guī)范化任何有意義的空白。 這與XAML規(guī)范的默認空白行為建議一致。通常,只有當您在XAML內(nèi)容屬性中指定字符串時,此行為的重要性才會體現(xiàn)出來。簡言之,XAML將空格、 換行符和制表符轉化為空格,如果它們出現(xiàn)在一個連續(xù)字符串的任一端,則保留一個空格。有關XAML空白處理的完整說明標記擴展標記擴展是一個 XAML語言概念。當用于提供特性語法的值時,大括號(和)表示標記擴展用法。 此用法指示XAML處理系統(tǒng)不要像通常那樣將特性值視為一個文本字符串或者可轉換為字符串的值。WPF應用程序編程中最常用的標記擴
20、展是 Binding (用于數(shù)據(jù)綁定表達式) 以及資源引用StaticResource和DynamicResource。通 過使用標記擴展,即使屬性通常不支持特性語法,也可以使用特性語法為屬性提供值。標記擴展經(jīng)常使用中間表達式類型實現(xiàn) 一些功能,例如,推遲值或引用僅在運行時才存在的其他對象。例如,下面的標記使用特性語法設置 Style屬性的值。Style屬性采用了 Style類的一個實例,該實例默認情況下未能用特性語法 字符串實例化。但在本例中,特性引用了特定的標記擴展 StaticResource當處理該標記擴展時,它返回對以前在資源字典中作 為鍵控資源進行實例化的某個樣式的引用。XAML打
21、印<Page.Resources><SolidColorBrush x:Key="MyBrush" Color= "Gold" /><Style TargetType= "Border" x:Key= "PageBackground" ><Setter Property -"Background" Value= "Blue" /></Style></Page.Resources><StackPane
22、l><Border Style- "StaticResource PageBackground"></Border></StackPanel>有關特定在 WPF中實現(xiàn)的所有 XAML標記擴展的參考列表,請參見WPF XAML擴展。有關由System.Xaml定義并且可更 廣泛用于.NET XAML 實現(xiàn)的標記擴展的參考列表,請參見 XAML命名空間(x:)語言功能。有關標記擴展概念的更多信息, 請參見標記擴展和 WPF XAML。類型轉換器在特性語法一節(jié)中,曾提到特性值必須能夠使用字符串進行設置。對字符串如何轉換為其他對象類型或基元
23、值的基本本機處理取決于String類型本身,以及對某些類型(如 DateTime或里)的本機處理。 但是很多 WPF類型或這些類型的成員擴展了基 本字符串特性處理行為,因此可以指定更復雜的對象類型的實例作為字符串和特性。Thickness結構是一個類型示例,該類型擁有可使用XAML的類型轉換。Thickness指示嵌套矩形中的度量并用作一些屬性(如Margin )的值。通過對Thickness設置類型轉換器,所有使用 Thickness的屬性都可以更容易地在 XAML中指定,因為它 們可指定為特性。下面的示例使用類型轉換和特性語法來為 Margin提供值:XAML打印<Button Ma
24、rgin= "10,20,10,30" Content= "Click me" />上面的特性語法示例與下面更為詳細的語法示例等效,但在下面的示例中,Margin改為通過包含Thickness對象元素的屬性元素語法進行設置。而且設置Thickness的四個關鍵屬性作為新實例的特性:XAML打印<Button Content= "Click me" ><Button.Margin><Thickness Left= "10" Top= "20" Right= &q
25、uot;10" Bottom= "30" /> </Button.Margin></Button>孑說明還有少數(shù)對象只能通過類型轉換這種公開方式在不涉及到子類的情況下為該類型設置屬性,因為 類型本身并沒有默認構造函數(shù)。一個示例是Cursor。有關如何支持類型轉換及其在特性語法上的應用的更多信息,請參見TypeConverters和XAML。XAML根元素和XAML 命名空間一個XAML文件只能有一個根元素,這樣才能同時成為格式正確的XML文件和有效的XAML文件。對于典型的 WPF方案,將使用在 WPF應用程序模型中具有重要意義的根元
26、素(例如,為頁使用 Window或Page,為外部字典使用ResourceDictionary或為應用程序定義使用 Application )。下面的示例演示 WPF頁的典型XAML文件的根元素,此根元素 為 PagaXAML打印<Pagexmlns= "ntation"xmlns:x= "</Page>根元素還包含特性xmlns和xmlns:x。這些特性向XAML處理器指明哪些XAML命名空間包含標記將要作為元素引用的后備 類型的類型定義。xmlns特性明確指示默認的 XAML命名空間。在默認的XAML命名空間中,可以不使用前綴指定標記中 的對
27、象元素。對于大多數(shù) WPF應用程序方案以及 SDK的WPF部分中給出的幾乎所有示例,默認的XAML命名空間均映射到為 WPF 命名空間 特性指示另外一個 XAML 命名空間, 該命名空間映射 XAML 語言命名空間 使用xmlns定義用法范圍和名稱范圍映射的做法符合XML 1.0規(guī)范。XAML名稱范圍與XML名稱范圍的不同僅在于:XAML名稱范圍還包含有關進行類型解析和分析XAML時名稱范圍的元素如何受類型支持的信息。請注意,只有在每個 XAML文件的根元素上,xmlns特性才是絕對必需的。xmlns定義將適用于根元素的所有子代元素(此 行為也符合xmlns的XML 1.0規(guī)范。)同時允許根以
28、下的其他元素上具有 xmlns特性,這些特性將適用于定義元素的任何子代 元素。但是,頻繁定義或重新定義 XAML命名空間可能會導致 XAML標記樣式難以閱讀。其XAML處理器的 WPF實現(xiàn)包括可識別 WPF核心程序集的基礎結構。已知 WPF核心程序集包含支持 WPF到默認 XAML命名空間的映射的類型。這是通過屬于項目生成文件以及WPF生成和項目系統(tǒng)一部分的配置來實現(xiàn)的。因此,為了引用來自WPF程序集的XAML元素,只需將默認 XAML命名空間聲明為默認 xmlns。x:前綴在上面的根元素示例中,前綴x:用于映射 XAML 命名空間 ,該命名空間是支持XAML語言構造的專用 XAML命名空間。
29、在這整個SDK的項目模板、示例以及文檔中,此 x:前綴用于映射該 XAML命 名空間。XAML語言的XAML命名空間包含多個將在 XAML中頻繁用到的編程構造。下面列出了將用到的最常見的 x:前 綴編程構造: x:Key:為ResourceDictionary (或其他框架中的類似字典概念)中的每個資源設置唯一的鍵。在典型的 WPF應用程序標記中的所有x:用法中,x:Key將可能占到90%。 x:Class:向為XAML頁提供代碼隱藏的類指定 CLR命名空間和類名。必須具有這樣一個類才能支持每個WPF編程模型的代碼隱藏,而正是因此,即使沒有資源,也幾乎總是能看到映射的x:。 x:Name:處理
30、對象元素后、為運行時代碼中存在的實例指定運行時對象名稱。通常,您將為x:Name經(jīng)常使用 WPF定義的等效屬性。此類屬性特定映射到 CLR后備屬性,因此更便于進行應用程序編程,在應用程序編程中,您經(jīng)常使用運行時代碼從初始化的XAML中查找命名元素。最常見的此類屬性是FrameworkElement .Name。在特定類型中不支持等效的 WPF框架級Name屬性時,仍然可以使用 x:Name。某些動畫方案中會發(fā)生這種情況。 x:Static:啟用一個返回靜態(tài)值的引用,該靜態(tài)值只能是一個XAML兼容屬性。 x:Type:根據(jù)類型名稱構造一個 Type引用。它用于指定采用Type (例如Style
31、.TargetType )的特性,但屬性經(jīng)常具 有本機的字符串到Type的轉換功能,因此使用x:Type標記擴展用法是可選的。x:前綴/XAML命名空間中還有其他一些不太常見的編程構造。有關詳細信息,請參見 XAML命名空間(x:)語言功能。XAML中的自定義前綴和自定義類型對于您自己的自定義程序集或 PresentationCora PresentationFramework和 WindowsBase的 WPF核心以外的程序集,可以將 該程序集指定為自定義 xmlns映射的一部分。只要該類型能夠正確地實現(xiàn)以支持您所嘗試的XAML用法,就可以在XAML中引用該程序集中的類型。下面是一個說明自定
32、義前綴如何在 XAML標記中工作的基本示例。前綴 custom在根元素標記中定義,并映射為隨應用程序 一同打包并可用于該應用程序的一個特定程序集。此程序集包含NumericUpDown 類型,實現(xiàn)該類型的目的是在支持常規(guī)XAML用法之外,還可以使用允許在 WPF XAML內(nèi)容模型的此特定點執(zhí)行插入的類繼承。通過使用該前綴,此NumericUpDown 控件的一個實例聲明為對象元素,以便 XAML分析器可找到包含該類型的 XAML命名空間,從而找到包 含該類型定義的后備程序集的位置。打印<Pagexmlns=" ntation"xmlns:x="xmlns:c
33、ustom="clr-namespace:NumericUpDownCustomControl;as sembly=CustomLibrary” ><StackPanel Name="LayoutRoot" ><custom:NumericUpDown Name="numericCtrl1" Width="100”Height="60" /> .</ StackPanel > </ Page >有關XAML 中自定義類型的更多信息,請參見 XAML 及 WPF的
34、自定義類。有關XML命名空間與程序集中后備代碼的命名空間如何相關的更多信息,請參見WPF XAML的XAML命名空間和命名空間映射。事件和XAML 代碼隱藏大多數(shù) WPF應用程序既包括 XAML標記,也包括代碼隱藏。在一個項目中, XAML編寫為.xaml文件,而CLR語言(如 Microsoft Visual Basic .NET 或C#)用于編寫代碼隱藏文件。 在 WPF編程和應用程序模型中對 XAML文件進行標記編譯時, XAML文件的XAML代碼隱藏文件的位置是通過如下方式來標識的:以 XAML的根元素的x:Class特性形式指定一個命名 空間和類。在目前已介紹的示例中,您已看到幾個按
35、鈕,但還沒有一個按鈕具有任何關聯(lián)的邏輯行為。為對象元素添加行為的主要應用程 序級機制是使用元素類的現(xiàn)有事件,并為在運行時引發(fā)該事件時調(diào)用的該事件編寫特定的處理程序。事件名稱以及要使用的處 理程序的名稱在標記中指定,而實現(xiàn)處理程序的代碼在代碼隱藏中定義。XAML<Pagexmlns= " ntation"xmlns:x= " x:Class= "ExampleNamespace.ExamplePage" > <Button Click= "Button_Click" >Click Me!</But
36、ton></Page>VBC#C+F#JScript打印namespace ExampleNamespacepublic partial class ExamplePagevoid Button_Click(object sender, RoutedEventArgs e)Button b = e.Source as Button;b.Foreground = Brushes.Red; 請注意,代碼隱藏文件使用 CLR命名空間ExampleNamespace 并將ExamplePage 聲明為該命名空間內(nèi)的一個分部類。這相當于在標記根中提供的 ExampleNamespace
37、 . ExamplePage 的x:Class特性值。WPF標記編譯器將通過從根元素類型派生 一個類,為編譯的任何 XAML文件創(chuàng)建一個分部類。當您提供也會定義同一分部類的代碼隱藏時,將在與編譯的應用程序相 同的命名空間和類中組合生成的代碼。有關WPF中代碼隱藏編程要求的更多信息,請參見 WPF中的代碼隱藏和 XAML中的代碼隱藏、事件處理程序和分部類要 求“一節(jié)。如果您不想創(chuàng)建一個單獨的代碼隱藏文件,還可以將代碼內(nèi)聯(lián)到XAML文件中。但是,內(nèi)聯(lián)代碼是一種缺少多樣性的方法,有很多的限制。有關詳細信息,請參見 WPF中的代碼隱藏和 XAML。路由事件路由事件是一個特殊的事件功能,該功能是WPF的
38、基礎。路由事件使一個元素可以處理另一個元素引發(fā)的事件,前提是這些元素通過樹關系連接在一起。使用XAML特性指定事件處理時,可以對任何元素(包括未在類成員表中列出路由事件的元素) 偵聽和處理該路由事件。這是通過以所屬類名限定事件名特性來實現(xiàn)的。例如,在當前所討論的StackPanel /Button 示例中,父StackPanel 可以通過在StackPanel 對象元素上指定特性Button.Click,并使用處理程序名作為特性值,為子元素按鈕的Click事件洋冊一個處理程序。 有關路由事件如何工作的更多信息,請參見 路由事件概述。XAML 命名元素默認情況下,通過處理 XAML對象元素在對象
39、圖中創(chuàng)建的對象實例沒有唯一標識符或對象引用。相反,如果在代碼中調(diào)用構 造函數(shù),則幾乎總是使用構造函數(shù)結果為構造的實例設置一個變量,以便以后在代碼中引用該實例。為了對通過標記定義創(chuàng)建 的對象提供標準化訪問,XAML定義了 x:Name特性。您可以在任何對象元素上設置 x:Name特性的值。在代碼隱藏中,您選 擇的標識符等效于引用所構造的實例的實例變量。在任何方面,命名元素都像它們是對象實例一樣工作(此名稱引用該實例),并且代碼隱藏可以引用該命名元素來處理應用程序內(nèi)的運行時交互。實例和變量之間的這種連接是由WPF XAML標記編譯器實現(xiàn)的,并且更具體涉及到功能和模式,例如本主題中將不詳細討論的In
40、itializeComponent。WPF框架級XAML元素繼承Name屬性,該屬性等效于 XAML定義的x:Name特性。其他某些類也為x:Name (通常也定 義為Name屬性)提供屬性級等效項。一般而言,如果您在所選元素/類型的成員表中找不到 Name屬性,則可以改用x:Name。x:Name值將通過特定子系統(tǒng)或通過諸如 FindName等實用工具方法,為可在運行時使用的XAML元素提供標識符。下面的示例在StackPanel元素上設置Name。然后,該StackPanel中的Button上的處理程序通過由 Name設置的實例引 用 buttonContainer來引用 StackPan
41、ekXAML打印<StackPanel Name= "buttonContainer" ><Button Click= "RemoveThis" >Click to remove this button</Button> </StackPanel>VBC#C+ F#JScript打印void RemoveThis(object sender, RoutedEventArgs e)FrameworkElement fe = e.Source as FrameworkElement;if (buttonCont
42、ainer.Children.Contains(fe)buttonContainer.Children.Remove(fe);就像變量一樣,實例的 XAML名稱受范圍概念的控制,因此可以在可預測的某個范圍內(nèi)強制名稱唯一。定義頁面的主標記表 示一個唯一的 XAML名稱范圍,而該 XAML名稱范圍的邊界就是該頁面的根元素。但是,其他標記源(如樣式或樣式中的 模板)可以在運行時與頁面交互,這種標記源常常具有自己的XAML名稱范圍,這些名稱范圍不一定與頁面的XAML名稱范圍相關聯(lián)。有關 x:Name和 XAML 名稱范圍的更多信息,請參見 Name、x:Name特性或WPF XAML 名稱范圍。附加屬
43、性和附加事件XAML指定了一個語言功能,該功能允許對任何元素指定某些屬性或事件,而不管要設置屬性或事件的元素的類型定義中是否 存在該屬性或事件。該功能的屬性版本稱為附加屬性,事件版本稱為附加事件。從概念上講,可以將附加屬性和附加事件視為 可以在任何XAML元素/對象實例上設置的全局成員。但是,元素 /類或更大的基礎結構必須支持附加值的后備屬性存儲。通常通過特性語法來使用 XAML中的附加屬性。在特性語法中,您可以采用所有者類型.屬性名”的形式指定附加屬性。表面上,這與屬性元素用法類似,但在這種情況下,您指定的所有者類型”始終是一種與從中要設置附加屬性的對象元素不同的類型。所有者類型”這種類型提
44、供XAML處理器為獲取或設置附加屬性值所需要的訪問器方法。使用附加屬性的最常見方案是使子元素能夠向其父元素報告屬性值。下面的示例演示了 DockPanel .Dock附加屬性。DockPanel類為DockPanel .Dock定義訪問器,因此擁有附加屬性。 DockPanel類 還包括一個邏輯,該邏輯迭代其子元素并具體檢查每個元素是否具有 DockPanel .Dock設置值。如果找到一個值,將在布局過程 中使用該值定位子元素。使用 DockPanel .Dock附加屬性和這種定位功能事實上是 DockPanel類的激動人心的一面。XAML打印<DockPanel><But
45、ton DockPanel.Dock= "Left" Width= "100" Height= "20" >I am on the left</Button><Button DockPanel.Dock= "Right" Width= "100" Height= "20" >I am on the right</Button> </DockPanel>在 WPF中,大部分或所有附加屬性還作為依賴項屬性來實現(xiàn)。有關詳細信息,
46、請參見附加屬性概述。附加事件使用類似的所有者類型.事件名”特性語法形式。就像非附加事件一樣,XAML中的附加事件的特性值指定對元素處 理事件時調(diào)用的處理程序方法的名稱。在WPF XAML中使用附加事件并不常見。有關更多信息,請參見 附加事件概述?;愋秃蚗AML基礎WPF XAML及其XAML命名空間是類型的一個集合,這些類型對應于CLR對象以及XAML的標記元素。但是,并不是所有的類都能映射到元素。 抽象類(如ButtonBase)和某些非抽象基類在 CLR對象模型中用于繼承。 基類(包括抽象類) 對于XAML開發(fā)仍然很重要,因為每個具體的XAML元素都從其層次結構中的某個基類繼承成員。通常
47、,這些成員包括可以設置為元素特性的屬性或者可以處理的事件。FrameworkElement是 WPF在 WPF框架級的具體 UI基類。設計UI時,您將使用各種形狀、面板、修飾器或控件類,它們?nèi)繌腇rameworkElement派生而來。有一個相關的基類 FrameworkContentElement, 它使用可在FrameworkElement中特意鏡像 API的API,支持適合流布局表示形式的面向文檔的元素。元素級的特性和 CLR對象模型的組合提供了一組通用的屬性,這些屬性可以在大多數(shù)具體的XAML元素上設置,而不管具體的 XAML元素類型及其基礎類型是什么。XAML 安全性XAML是一種
48、直接表示對象實例化和執(zhí)行的標記語言。因此,在 XAML中創(chuàng)建的元素能夠像等效的生成代碼那樣與系統(tǒng)資源 (如網(wǎng)絡訪問、文件系統(tǒng) IO)進行交互。WPF支持,NET安全框架代碼訪問安全性(CAS)。這意味著在Internet區(qū)域中運行的 WPF內(nèi)容具有更少的執(zhí)行權限。”寬 松XAML (由XAML查看器在加載時解釋的非編譯 XAML的頁面)和XAML瀏覽器應用程序(XBAP)通常在此Internet 區(qū)域中運行,并且使用相同的權限集。但是,加載到完全受信任的應用程序中的XAML與承載應用程序具有相同的系統(tǒng)資源訪問權限。有關更多信息,請參見 WPF部分信任安全。從代碼中加載 XAMLXAML可用于定
49、義整個 UI,但有時也適合在 XAML中定義UI的一部分。此功能可用于實現(xiàn)部分自定義,在本地存儲信息, 使用XAML提供業(yè)務對象或者各種可能的方案。這些方案的關鍵是XamlReader類及其Load方法。輸入是一個XAML文件, 而輸出是一個對象,表示從該標記創(chuàng)建的整個運行時對象樹。然后您可以插入該對象,作為應用程序中已存在的另一個對象的 屬性。只要該屬性在具有最終顯示功能并且將通知執(zhí)行引擎已向應用程序中添加新內(nèi)容的內(nèi)容模型中是一個合適的屬性,就可 以通過載入XAML非常輕松地修改正在運行的應用程序的內(nèi)容。請注意,通常只在完全受信任的應用程序中使用此功能,因 為將文件加載到正在運行的應用程序中
50、會帶來明顯的安全隱患。接下來的內(nèi)容本主題簡單介紹了適用于 WPF的XAML語法概念和術語。有關本文使用的術語的更多信息,請參見 XAML語法詳述。如果尚未做過 WPF入門教程主題中的練習,請試做。當您創(chuàng)建該教程中介紹的以標記為中心的應用程序時,其中的練習將幫助您鞏固本主題中介紹的許多概念。WPF使用一個特定的應用程序模型,該模型基于Application類。有關詳細信息,請參見 應用程序管理概述。生成WPF應用程序(WPF)為您詳細介紹了如何通過命令行以及使用Microsoft Visual Studio生成包含XAML的應用程序。依賴項屬性概述詳細介紹了 WPF中屬性的多樣性,并介紹了依賴項
51、屬性的概念。請參見概念XAML語法詳述XAML及WPF的自定義類基元素概述WPF中的樹其他資源XAML命名空間(x:)語言功能WPF XAML 擴展Xaml語法詳述發(fā)送反饋本主題定義用于描述 XAML語法中各個元素的術語。本文檔的其余部分將經(jīng)常用到這些術語,既特定適用于WPF文檔,也適用于其他框架,這些框架使用由 System.Xaml級別的XAML語言支持實現(xiàn)的 XAML或基本XAML概念。本主題進一步 闡述主題 XAML 概述(WPF)中曾介紹過的基本術語。本主題包括下列各節(jié)。 XAML語言規(guī)范 XAML 和 CLR 對象元素語法 對象元素的屬性 特性語法(屬性) 屬性元素語法 集合語法
52、XAML內(nèi)容屬性 內(nèi)容屬性和集合語法組合, XAML命名空間 標記擴展 附加屬性 附加事件 XAML根元素剖析 可選的和不建議的 XAML用法, 相關主題XAML語言規(guī)范XAML語言規(guī)范中也定義或引用了此處定義的XAML語法術語。XAML是一種基于 XML并遵循或擴展 XML結構規(guī)則的語言。其中某些術語共享自或基于描述XML語言或XML文檔對象模型時常用的術語。有關XAML語言規(guī)范的更多信息,請從Microsoft下載中心下載MS-XAML。XAML 和 CLRXAML是一種標記語言。顧名思義,公共語言運行時(CLR)實現(xiàn)了運行時執(zhí)行。XAML本身并非CLR運行時直接使用的一種公共語言。而是可
53、以將 XAML視為支持其自身的類型系統(tǒng)。 WPF所使用的特定 XAML分析系統(tǒng)是根據(jù) CLR和CLR類 型系統(tǒng)構建的。在分析 WPF的XAML時,XAML類型將映射到 CLR類型,以便將運行時表示形式實例化。出于此原因, 本文檔中語法討論的其余部分將包括對CLR類型系統(tǒng)的引用,而XAML語言規(guī)范中并未就這部分語法展開討論。(在XAML語言規(guī)范的每個級別,XAML類型都可以映射到任何其他類型系統(tǒng),而不一定要映射到CLR,但這需要創(chuàng)建和使用一種不同的XAML分析器。)類型成員和類繼承屬性和事件在作為 WPF類型的XAML成員時,通常從基類型繼承而來。請考慮此代碼示例:ButtonBackgroun
54、d="Blue" ./。如果要查看類定義、反射結果或文檔,則Background屬性并不是Button類上立即聲明的屬性。相反,Background是從基Control類繼承而來。WPF XAML元素的類繼承行為與架構對XML標記的強制解釋大相徑庭。類繼承可能會變得很復雜,特別是在中間基類為抽象類或涉及到接口的情況下尤為如此。由于這樣一個原因,因此很難通過XML編程常用的架構類型(例如DTD或XSD格式)準確并完整地表示 XAML元素及其所允許特性的集合。另一個原因是, XAML語言本身的擴展性和類型映射功能會對所 允許類型和成員的任何固定表示形式的完整性造成妨礙。對象元素
55、語法對象元素語法是一種 XAML標記語法,它通過聲明 XML元素將CLR類或結構實例化。這種語法類似于如HTML等其他標記語言的元素語法。對象元素語法以左尖括號()開始,后面緊跟要實例化的類或結構的類型名稱。類型名稱后面可以有零個或多個空格,對于對象元素還可以聲明零個或多個特性,并用一個或多個空格來分隔每個特性名="值"”對。最后,必須存在下列一種情況: 元素和標記必須用正斜杠 (/)和緊跟的右尖括號()結尾。 開始標記必須以右尖括號 ()結尾。其他對象元素、屬性元素或內(nèi)部文本可以跟在開始標記后面。此處可以包含的確切內(nèi)容通常會受到元素對象模型的約束。對象元素還必須存在等效的
56、結束標記,并與其他開始標記/結束標記對形成正確的嵌套和平衡。由.NET實現(xiàn)的XAML具有一組規(guī)則,可將對象元素映射為類型、將特性映射為屬性或事件以及將XAML命名空間映射到CLR命名空間和程序集。對于 WPF和.NET Framework , XAML對象元素映射到 Microsoft .NET類型(如引用的程序集中 所定義),而特性映射到這些類型的成員。在 XAML中引用CLR類型時,還可以訪問該類型的繼承成員。例如,下面的示例是一個對象元素語法,該語法實例化Button類的一個新實例,而且還指定了一個Name特性及其值:XAML<Button Name="CheckoutB
57、utton"/>下例是其中也包括 XAML內(nèi)容屬性語法的對象元素語法。其中包含的內(nèi)部文本將用于設置TextBox的XAML內(nèi)容屬性Text。XAML<TextBox>Thisis a Text Box</TextBox>內(nèi)容模型從語法上講,類可能支持作為XAML對象元素的用途,但只有將該元素放置在整體內(nèi)容模型或元素樹中的應有位置時,該元素才能在應用程序或頁面中發(fā)揮正常的作用。例如,Menuitem通常只應作為MenuBase派生類(如Menu)的子級放置。 在可 用作XAML元素的控件和其他 WPF類的類頁面上,將特定元素的內(nèi)容模型記錄為備注的一部分。對
58、象元素的屬性XAML中的屬性是由多種可能的語法設置的。根據(jù)所設置屬性的基礎類型系統(tǒng)的特征,可用于特定屬性的語法將有所不同。通過設置屬性值,可以在對象存在于運行時對象圖中時為對象添加功能或特征。從對象元素中創(chuàng)建的對象的初始狀態(tài)基于默認 的構造函數(shù)行為。通常,您的應用程序將使用其他一些實例,而不是任何給定對象的完全默認的實例。特性語法(屆性)特性語法是一種 XAML標記語法,該語法聲明現(xiàn)有對象元素中的特性,從而設置屬性的值。特性名稱必須與支持相關對象元 素的類的屬性的CLR成員名稱相匹配。特性名稱后面跟隨一個賦值運算符 (=)。特性值必須是用引號引起來的字符串??烧f明可以使用替代引號在特性中放置文本引號。例如,可以使用單引號作為聲明其中包含雙引號字符 的字符串的一種方法。無論使用單引號還是雙引號,對于開始和結束特性值字符串都應該使用一 對匹配的字符。還有一些轉義序列或其他技術可用于解決任何特定XAML語法規(guī)定的字符限制。請參見XML字符實體和 XAML。為了通過特性語法進行設置,屬性必須為公共屬性,并且必須可寫。后備類型系統(tǒng)中屬性的值必須為值類型,或者必須為
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 古建筑修復塔吊租賃協(xié)議
- 低溫倉儲租賃協(xié)議
- 飛機跑道防水施工合同
- 福建省莆田市(2024年-2025年小學六年級語文)部編版期末考試(上學期)試卷及答案
- 單位管理制度品讀匯編人力資源管理篇
- 單位管理制度精彩選集人事管理篇十篇
- 單位管理制度佳作合集人事管理
- 2024廢舊鋼材回收與環(huán)保處理合同版
- 2024民法典合同范本:新能源汽車充電設施投資建設合同3篇
- 2024源碼保密協(xié)議范本:虛擬偶像項目源碼安全合作協(xié)議3篇
- 食堂日??己嗽u分表(后勤)
- 高頻淬火設備安全操作規(guī)程
- 閘閥的操作力矩參考表
- 浙江省市政工程安全臺賬完整
- 環(huán)氧樹脂參考配方大全
- 花木綠化養(yǎng)護考核評分表
- #2鍋爐爐膛內(nèi)腳手架搭設及拆除施工方案
- 110KV變電站工程創(chuàng)優(yōu)監(jiān)理實施細則
- 檢驗批劃分大全16頁
- 教材中醫(yī)方劑學
- 2022年2022年電子信息系統(tǒng)機房設計規(guī)范
評論
0/150
提交評論