日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

WPF基础之XAML

發布時間:2025/4/16 asp.net 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WPF基础之XAML 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本主題介紹可擴展應用程序標記語言 (XAML) 語言的功能,并演示如何使用 XAML 編寫 Windows Presentation Foundation (WPF) 應用程序。本主題專門介紹了 Windows Presentation Foundation (WPF) 實現的 XAML。XAML 本身是比 Windows Presentation Foundation (WPF) 更廣泛的一個語言概念。

具有流控制支持的聲明性語言 XAML 簡化了為 .NET Framework 編程模型創建 UI 的過程。您可以在聲明性 XAML 標記中創建可見的 UI 元素,然后使用代碼隱藏文件(通過分部類定義與標記相連接)將 UI 定義與運行時邏輯相分離。在 XAML 中混合代碼和標記的功能很重要,因為 XML 本身是聲明性的,不會為流控制真正建議一個模型?;?XML 的聲明性語言非常直觀,可以為用戶(尤其是具有 Web 設計和技術背景的人員)創建從原型到生產的各種界面。與其他大多數標記語言不同,XAML 直接呈現托管對象的實例化。這種常規設計原則簡化了使用 XAML 創建的對象的代碼和調試訪問。

XAML 文件是指通常使用 .xaml 擴展名的 XML 文件。

下面的 XAML 示例演示了小標記在創建作為 UI 一部分的按鈕時的必要性。創建的按鈕通過主題樣式獲得默認的可視化表示形式,通過其類設計獲得默認的行為。

XAML 對象元素 XAML 有一組規則,這些規則將對象元素映射為類或結構,將屬性 (Attribute) 映射為屬性 (Property) 或事件,并將 XML 命名空間映射為 CLR 命名空間。XAML 元素映射為被引用程序集中定義的 Microsoft .NET 類型,而屬性 (Attribute) 則映射為這些類型的成員。

上面的示例指定了兩個對象元素:<STACKPANEL>(具有一個結束標記)和<BUTTON>同樣具有多個屬性;下一節將介紹屬性)。字符串 StackPanel 和 Button 都將映射為某個類的名稱,該類由 WPF 定義并且是 WPF 程序集的一部分。在指定對象元素標記時,可以為 XAML 處理創建一條指令,以便在加載 XAML 頁時創建指定類的一個新實例。每個實例都是通過調用基礎類或結構的默認構造函數并對結果進行存儲而創建的。為了可用作 XAML 中的對象元素,該類或結構必須公開一個公共的默認(無參數)構造函數。

?

設置屬性 XAML 中的屬性是通過使用各種可能的語法在對象元素上設置屬性來設置的。根據所設置的屬性的特征,給定屬性可使用的語法會有所不同。

通過設置屬性值,可以為對象元素添加功能或特征。對象元素的基礎對象實例的初始狀態基于默認的構造函數行為。通常,您的應用程序將使用其他一些實例,而不是任何給定對象的完全默認的實例。

屬性語法 在 XAML 中,屬性 (Property) 常常可以表示為屬性 (Attribute)。屬性 (Attribute) 語法是最簡單的屬性 (Property) 設置語法,并將成為過去使用標記語言的開發人員可以使用的最直觀的語法。例如,以下標記將創建一個具有紅色文本和藍色背景的按鈕,還會創建指定為 Content 的顯示文本。

屬性元素語法 對于一個對象元素的某些屬性 (Property),屬性 (Attribute) 語法是不可能實現的,因為提供屬性 (Property) 值所需的對象或信息不能充分地表示為簡單的字符串。對于這些情況,可以使用另一個語法,即屬性元素語法。屬性元素語法用標記的內容設置包含元素的引用的屬性。一般而言,內容就是作為屬性值的類型的某個對象(值設置實例通常被指定為另一個對象元素)。屬性元素本身的語法為 <類型名稱.屬性>。指定內容之后,必須用一個結束標記結束屬性元素,就像其他任何元素(語法為 )一樣。對于同時支持屬性 (Attribute) 和屬性 (Property) 元素語法的屬性 (Property),盡管這兩種語法的細微之處(如空白處理)略有不同,但它們的結果通常是一樣的。如果可以使用屬性 (Attribute) 語法,那么使用屬性 (Attribute) 語法通常更為方便,且能夠實現更為精簡的標記,但這只是一個風格的問題,而不屬于技術限制。下面的示例演示了在前面的屬性 (Attribute) 語法示例中設置的相同屬性 (Property),但這次對 Button 的所有屬性 (Property) 使用了屬性 (Property) 元素語法。

XAML 的屬性 (Property) 元素語法表示了與標記的基本 XML 解釋之間的巨大背離。對于 XML,<類型名稱.屬性> 代表了另一個元素,該元素僅表示一個子元素,而與 TypeName 父級之間沒有必然的隱含關系。在 XAML 中,<類型名稱.Property> 直接表示 Property 是類型名稱 的屬性(由屬性元素內容設置),而絕不會是一個名稱相似(碰巧名稱中有一個點)但卻截然不同的元素。

屬性和類繼承 作為 WPF 元素的XAML 屬性 (Attribute) 而出現的屬性 (Property) 通常從基類繼承而來。例如,在上一個示例中,如果您要查看類定義、反射結果或文檔,Background 屬性并不是在 Button 類上直接聲明的屬性。相反,Background 是從基 Control 類繼承而來。

WPF XAML 元素的類繼承行為是與標記的基本 XML 解釋之間的另一個巨大背離。使用類繼承(尤其是中間基類為抽象類時)的另一個原因在于,通過 XML 編程常用的架構類型(如 DTD 或 XSD 格式)幾乎不可能準確且完整地表示 XAML 元素及其允許屬性集。另外,XAML 中的“X”表示“extensible”(可擴展),而可擴展性破壞了“什么是用于 WPF 的 XAML”的任何給定表示形式的完整性。

引用值和標記擴展 標記擴展是一個 XAML 概念。在屬性語法中,花括號({ 和 })表示標記擴展用法。此用法指示 XAML 處理不要像通常那樣將屬性值視為一個字符串或者可直接轉換為文本字符串的值。

當屬性采用引用類型值時,這些屬性常常需要屬性元素語法(始終創建一個新實例)或通過標記擴展的對象引用。標記擴展用法有可能會返回現有實例,因此可以更加多樣化,或者產生較少的對象系統開銷。

當使用標記擴展提供屬性值時,應改為由相關標記擴展的后備類中的邏輯提供屬性值。WPF 應用程序編程中最常用的標記擴展是 Binding(用于數據綁定表達式)以及資源引用 StaticResource 和 DynamicResource。通過使用標記擴展,即使屬性 (Property) 不支持對直接對象實例化使用屬性 (Attribute) 語法,也可以使用屬性 (Attribute) 語法為屬性 (Property) 提供引用值;或者使特定行為能夠符合必須用屬性 (Property) 類型值填充 XAML 屬性 (Property) 這一常規行為要求。

例如,下面的示例使用屬性 (Attribute) 語法設置 Style 屬性 (Property) 的值。Style 屬性 (Property) 采用了 Style 類的一個實例,這是默認情況下不能在屬性 (Attribute) 語法字符串中指定的引用類型。但在本例中,屬性 (Attribute) 引用了特定的標記擴展 StaticResource。當處理該標記擴展時,它返回對以前在資源字典中作為鍵控資源進行實例化的某個樣式的引用。

資源只是 WPF 或 XAML 啟用的一種標記擴展用法。

支持 Typeconverter 的屬性值
在“屬性語法”一節中,曾提到屬性值必須能夠使用字符串進行設置。對字符串如何轉換為其他對象類型或基元值的基本本機處理取決于 String 類型本身。但是很多 WPF 類型或這些類型的成員擴展了基本字符串屬性處理行為,因此更復雜的對象類型的實例可通過字符串指定為屬性值。在代碼級別,此處理是通過指定處理字符串屬性值的 CLR 類型轉換器來完成的。常用于指示矩形區域尺寸(如 Margin)的 Thickness 結構類型是這樣一個類型的示例:它具有針對采用該類型的所有屬性 (Property) 公開的一個特殊的、支持類型轉換器的屬性 (Attribute) 語法,以便于在 XAML 標記中使用。下面的示例使用支持類型轉換器的屬性 (Attribute) 語法來為 Margin 提供值:

上面的屬性 (Attribute) 語法示例與下面更為詳細的語法示例等效,但在下面的示例中,Margin 是通過包含 Thickness 對象元素的屬性 (Property) 元素語法設置的,而且 Thickness 的四個關鍵屬性 (Property) 設置為新實例的屬性 (Attribute):

是使用支持類型轉換器的語法,還是使用更詳細的等效語法,通常只是編碼風格的選擇問題,但支持轉換器的語法有助于生成更簡潔的標記。(但是,有一些對象只能采用類型轉換器將屬性設置為該類型,因為類型對象本身并沒有默認的構造函數。例如,Cursor。)

集合類型和 XAML 集合屬性 XAML 指定了一個語言功能,通過該功能,可以從標記中特意省略表示集合類型的對象元素。當 XAML 處理器處理采用了集合類型的屬性時,將隱式創建相應集合類型的實例,即使標記中不存在該集合的對象元素也是如此。在集合類型的 SDK 參考頁中,特意省略集合對象元素的這種語法在 XAML 語法部分中有時候稱為“隱式集合語法”。

隱式集合語法適用于實現 IList 或 IDictionary 的類型,或者適用于數組。

您已經在 XAML 資源示例中看到了未調用的集合對象元素的隱式集合語法的示例:

除了根元素外,頁面上作為另一個元素的子元素而嵌套的每個對象元素實際上都是下列一種或兩種情況下的元素:父元素的隱式集合屬性的一個成員,或者為父元素指定 XAML 內容屬性值的元素(XAML 內容屬性將在下一節進行討論)。換言之,一個標記頁上的父元素與子元素之間的關系實際上就是一個根對象,而根對象下面的每個對象元素要么是為父元素提供屬性值的一個實例,要么是同樣作為父元素的集合類型屬性值的集合中的一項。在資源示例的案例中,Resources 屬性采用 ResourceDictionary 類型的一個對象。下面的示例在語法上與顯式指定的 ResourceDictionary 的對象元素等效。

Resources 集合是許多常見的 WPF 框架級元素上存在的集合屬性的一個示例。在 XAML 中設置此屬性需要使用屬性元素語法。屬性元素中的每個被包含的對象元素都成為集合(IDictionary 實現)中的一個項。雖然集合類型本身通常沒有包含項的屬性或索引器,但是該屬性不能在標記中指定;它完全是隱含的。對于 ResourceDictionary,該屬性是 Item 索引器。

XAML 內容屬性 XAML 指定了一個語言功能,通過該功能,任何可以用作 XAML 對象元素的類都可以確切指定其屬性之一作為該類實例的 XAML 內容屬性。當 XAML 處理器處理具有 XAML 內容屬性的對象元素時,該對象元素的任何 XML 子元素都被當作包含在一個表示該內容屬性的隱式屬性元素標記中來處理。在標記中,可以省略 XAML 內容屬性的屬性元素語法。在標記中指定的任何子元素都將成為 XAML 內容屬性的值。

您已經看過了未調用的 XAML 內容屬性的示例:本主題中的第一個示例。

這里,Button 是 StackPanel 的子元素。這是一個簡單直觀的標記,其中出于兩個不同的原因省略了兩個標記。

省略的 StackPanel.Children 屬性元素: StackPanel 從 Panel 派生。Panel 將 Panel..::.Children 定義為其 XAML 內容屬性。Panel 的所有派生類因而具有該 XAML 內容屬性,而 Panel..::.Children 的屬性元素可省略。

省略的 UIElementCollection 對象元素: Panel..::.Children 屬性采用類型 UIElementCollection,該類型實現 IList。因此,根據為集合定義的 XAML 規則,可以省略 UIElementCollection 對象元素標記。在這種情況下,UIElementCollection 實際上不能實例化為一個對象元素。您甚至無法顯式聲明該集合對象。這是因為 UIElementCollection 不公開默認的構造函數。其他幾個 WPF 集合類型也不公開對象元素用法的構造函數,因為 XAML 集合語法處理仍然允許它們在 XAML 中隱式工作。這就是 UIElementCollection 對象元素在示例中顯示為已被注釋的原因;如果未被注釋,示例將不能編譯。

內部文本和 XAML 內容屬性 StackPanel / Button 示例還有另一種變體。

請注意為 Button 指定的顯示文本如何發生變化。前面已在屬性 (Attribute) 語法中指定了 Content 屬性 (Property);這次顯示字符串是 Button 對象元素中的內部文本。此語法可行,因為 Content 是 Button 基類 ContentControl 的 XAML 內容屬性。元素中的字符串根據 Content 屬性的屬性類型(即 Object)進行計算。Object 不會嘗試任何字符串類型轉換,因此 Content 屬性的值變成了文本字符串值?;蛘?#xff0c;Button 中的內容可以是任何單個 Object。Button 等控件通常為類定義 XAML 內容屬性,因此 XAML 內容屬性可用于 UI 和顯示文本,或用于控件合成,或同時用于此兩者。

對于流程文檔模型和本地化而言,在元素中放置字符串作為內容以生成與其他常見標記語言類似的標記的功能特別重要。

XAML 內容屬性值必須連續 XAML 內容屬性的值必須完全在該對象元素的其他任何屬性元素之前或之后指定。不管 XAML 內容屬性的值指定為字符串還是指定為一個或多個對象都是如此。例如,下面的標記無法進行編譯:

這在本質上是非法的,因為如果此語法是通過使用內容屬性的屬性元素語法而變為顯式的,則內容屬性將設置兩次:

一個類似的非法示例是,如果內容屬性是一個集合,則子元素是與屬性元素交錯的:

內容模型 從語法上講,可能支持將類用作 XAML 元素,但只有放置到整體內容模型或元素樹中的所需位置時,該元素才能在應用程序或頁面上正常運行。例如,MenuItem 通常只應作為 MenuBase 派生類(如 Menu)的子級放置。特定元素的內容模型在可用作 XAML 元素的控件和其他 WPF 類的類頁面上的備注中進行說明。對于具有更復雜內容模型的某些控件,內容模型作為單獨的概念主題進行說明。

XAML 中的大小寫和空白 XAML 區分大小寫。按名稱與程序集中的基礎類型進行比較或者與類型的成員進行比較時,必須使用正確的大小寫指定所有對象元素、屬性 (Property) 元素和屬性 (Attribute) 名稱。屬性的值并不總是區分大小寫。值是否區分大小寫將取決于與采用該值的屬性關聯的類型轉換器行為,或取決于屬性值類型。例如,采用 Boolean 類型的屬性可以采用 true 或 True 作為等效值,但只是因為 Boolean 的默認字符串類型轉換已經允許這些值作為等效值。

XAML 處理器和序列化程序將忽略或刪除所有無意義的空白,并規范化任何有意義的空白。只有當您在 XAML 內容屬性中指定字符串時,才會體現此行為的重要性。簡言之,XAML 將空格、換行符和制表符轉化為空格,如果它們出現在一個連續字符串的任一端,則保留一個空格。

有關 XAML 語法的更多信息 隱式集合語法和 XAML 內容屬性都是允許省略某些推斷標記的 XAML 語言功能。這些功能的目的是在編寫或檢查標記時使頁面上的元素的父子關系更明顯。

如果您正在創建自定義類,并且正在考慮是否允許使用 XAML,XAML 語法術語主題也是一個很好的起點。

XAML 根元素和 xmlns 一個 XAML 文件只能有一個根元素,這樣才能成為格式正確的 XML 文件和有效的 XAML 文件。通常,應選擇屬于應用程序模型一部分的元素(例如,為頁面選擇 Window 或 Page,為外部字典選擇 ResourceDictionary,或為應用程序定義根選擇 Application)。下面的示例演示 WPF 頁面的典型 XAML 文件的根元素,其中的根元素為 Page。

根元素還包含屬性 xmlns 和 xmlns:x。這些屬性向 XAML 處理器指明哪些命名空間包含標記將要引用的元素的元素定義。xmlns 屬性專門指示默認的 xmlns 命名空間。在默認的 xmlns 命名空間中,可以不使用前綴指定標記中的對象元素。對于大多數 WPF 應用程序方案以及 SDK 的 WPF 部分中給出的幾乎所有示例,默認的 xmlns 命名空間均映射為 WPF 命名空間 http://schemas.microsoft.com/winfx/2006/xaml/presentation。xmlns:x 屬性指示另外一個 xmlns 命名空間,該命名空間映射 XAML 語言命名空間 http://schemas.microsoft.com/winfx/2006/xaml。在具有此映射的文件的標記中引用時,XAML 規范定義的必需語言組件帶有 x: 前綴。使用 xmlns 定義用法范圍和映射的這種做法符合 XML 1.0 規范。請注意,xmlns 屬性僅在每頁的根元素上和應用程序定義上(如果在標記中提供了應用程序定義)才是嚴格必需的。xmlns 定義將應用于根的所有子元素。(此行為仍然符合 xmlns 的 XML 1.0 規范。)xmlns 屬性還允許出現在根下面的其他元素上,并且將應用于定義元素的任何子元素。但是,此用法并不典型,因為頻繁定義或重新定義 xmlns 命名空間可能會導致 XAML 標記樣式難以閱讀。

由于存在屬于項目生成文件一部分的配置,因此可以知道 WPF 程序集包含的某些類型支持 WPF 到默認 xmlns 的映射。程序集還映射到目標文件中。因此,為了引用來自 WPF 程序集的 XAML 元素,只需映射 xmlns 即可。對于您自己的自定義程序集,或者除 WPF 之外的程序集,可以將該程序集指定為 xmlns 映射的一部分。通常,可選擇其他前綴,但是也可以選擇其他 xmlns 作為默認值,然后將 WPF 映射到前綴。

x: 前綴 在前面的根元素示例中,前綴 x: 用于映射 XAML xmlns http://schemas.microsoft.com/winfx/2006/xaml。在此 SDK 的項目模板、示例以及文檔中,此 x: 前綴將用于映射 XAML xmlns。x: 前綴/XAML xmlns 包含多個將在 XAML 中頻繁用到的編程構造。下面列出了將用到的最常見 x: 前綴/XAML xmlns 編程構造:

x:Key:為 ResourceDictionary 中的每個資源設置一個唯一的鍵。在應用程序標記中看到的所有 x: 用法中,x:Key 可能占到 90%。

x:Class:向為 XAML 頁提供代碼隱藏的類指定 CLR 命名空間和類名。必須具有這樣一個類才能支持代碼隱藏,也正是由于這個原因,即使沒有資源,您也幾乎總是會看到映射的 x:。

x:Name:處理對象元素后,為運行時代碼中存在的實例指定運行時對象名稱。在不支持等效的 WPF 框架級Name 屬性的情況下命名元素時,可以使用 x:Name。某些動畫方案中會發生這種情況。

x:Static:啟用一個獲取靜態值的值引用,該靜態值只能是一個 XAML 可設置屬性。

x:Type:根據類型名稱構造一個 Type 引用。它用于指定采用 Type 的屬性 (Attribute),如 Style..::.TargetType,不過在許多情況下屬性 (Property) 本身具有字符串到 Type 的轉換功能,因此使用 x:Type 是可選的。

x: 前綴/XAML xmlns 中還有其他一些不太常見的編程構造。 事件和 XAML 代碼隱藏 大多數 WPF 應用程序都是既包括標記,又包括代碼隱藏。在一個項目中,XAML 被編寫為 .xaml 文件,而使用 CLR 語言(如 Microsoft Visual Basic .NET 或 C#)編寫代碼隱藏文件。編譯 XAML 文件時,每個 XAML 頁的 XAML 代碼隱藏文件的位置是通過指定一個命名空間和類作為 XAML 頁的根元素的 x:Class 屬性來確定的。

在目前已介紹的示例中,您已看到幾個按鈕,但還沒有一個按鈕具有任何關聯的邏輯行為。為對象元素添加行為的主要應用程序級機制是使用元素類的現有事件,并為在運行時引發該事件時調用的該事件編寫特定的處理程序。事件名稱以及要使用的處理程序的名稱在標記中指定,而實現處理程序的代碼在代碼隱藏中定義。

請注意,代碼隱藏文件使用命名空間 MyNamespace 并將 MyPageCode 聲明為該命名空間內的一個分部類。這相當于在標記根中提供的 MyNamespace.MyPageCode 的 x:Class 屬性值。編譯器將通過從根元素類型派生一個類,自動為編譯的任何 XAML 頁創建一個分部類。當您提供也會定義同一分部類的代碼隱藏時,將在與編譯的應用程序相同的命名空間和類中組合生成的代碼。

如果您不想創建單獨的代碼隱藏文件,還可以將代碼內聯到 XAML 文件中。但是,內聯代碼是一種缺少多樣性的方法,有很多的限制。

事件屬性語法 當您在標記中通過事件指定行為時,通常使用屬性語法來附加處理程序。在其中指定事件屬性的對象元素則變成偵聽事件以及調用處理程序的實例。您要處理的具體事件的名稱是屬性名。屬性值是您要定義的處理程序的方法名。然后您必須在代碼隱藏中提供處理程序實現,并使處理程序基于該事件的委托。您使用編程語言(如 Microsoft Visual Basic .NET 或 C#)在代碼隱藏中編寫處理程序。

引發事件時,每個 WPF 事件都將報告事件數據。事件處理程序可以訪問這些事件數據。在前面的示例中,處理程序通過事件數據獲取所報告的事件源,然后在該事件源上設置屬性。

路由事件 路由事件是一個特殊的事件功能,該功能是 WPF 特有的并且是它的基礎。路由事件允許一個元素處理另一個元素引發的事件,只要這些元素通過元素樹關系連接起來。當使用 XAML 屬性指定事件處理時,可以在任何元素(包括未在類成員表中列出該特定事件的元素)上偵聽和處理路由事件。這是通過使用所屬類名限定事件名屬性來實現的。例如,在當前所討論的 StackPanel / Button 示例中,父 StackPanel 可以通過在 StackPanel 對象元素上指定屬性 Button.Click,并使用處理程序名作為屬性值,為子元素按鈕的 Click 事件注冊一個處理程序。

x:Name
默認情況下,通過處理對象元素而創建的對象實例沒有可供您在代碼中使用的唯一標識符或固有的對象引用。當您在代碼中調用構造函數時,幾乎總是使用構造函數結果為構造的實例設置一個變量,以便以后在代碼中引用該實例。為了對通過標記定義創建的對象進行標準化訪問,XAML 定義了 x:Name 屬性。您可以在任何對象元素上設置 x:Name 屬性的值。在代碼隱藏文件中,您選擇的標識符等效于引用所構造的實例的實例變量。在任何方面,命名元素都像它們是對象實例一樣工作(此名稱只是引用該實例),并且代碼隱藏文件可以引用該命名元素來處理應用程序內的運行時交互。

WPF 框架級 XAML 元素繼承 Name 屬性 (Property),該屬性等效于 XAML 定義的 x:Name 屬性 (Attribute)。其他某些類也為 x:Name(通常也定義為 Name 屬性)提供屬性級等效項。一般而言,如果您在所選元素的成員表中找不到 Name 屬性,可以改用 x:Name。

下面的示例在 StackPanel 元素上設置 Name。然后,該 StackPanel 中的 Button 上的處理程序通過由 Name 設置的實例引用 buttonContainer 來引用 StackPanel。

就像變量一樣,實例的名稱受范圍概念的控制,因此可以在可預測的某個范圍內強制名稱唯一。定義頁面的主要標記表示一個唯一的名稱范圍,而該名稱范圍的邊界就是該頁面的根元素。但是,其他標記源(如樣式或樣式中的模板)可以在運行時與頁面交互,這種標記源常常具有其自己的名稱范圍,這些名稱范圍不一定與頁面的名稱范圍相連接。

附加屬性和附加事件 XAML 指定了一個語言功能,該功能允許在任何元素上指定某些屬性或事件,而不管要為其設置屬性或事件的元素的成員表中是否存在該屬性或元素。該功能的屬性版本稱為附加屬性,事件版本稱為附加事件。從概念上講,您可以將附加屬性和附加事件認為是可以在任何元素/類上設置的全局成員,而不管其類層次結構如何。

通常通過屬性 (Attribute) 語法來使用 XAML 中的附加屬性 (Property)。在屬性 (Attribute) 語法中,您可以按照所有者類型.屬性名 的形式指定附加屬性 (Property)。表面上,這與屬性元素用法類似,但在這種情況下,您指定的所有者類型 始終是一種與要為其設置附加屬性的對象元素不同的類型。所有者類型 這種類型提供 XAML 處理器獲取或設置附加屬性值所需要的訪問器方法。使用附加屬性的最常見方案是使子元素能夠向其父元素報告屬性值。

下面的示例演示了 DockPanel..::.Dock 附加屬性。DockPanel 類為 DockPanel..::.Dock 定義訪問器,因此擁有附加屬性。DockPanel 類還包括一個邏輯,該邏輯迭代其子元素并具體檢查每個元素是否具有 DockPanel..::.Dock 設置值。如果找到一個值,將在布局過程中使用該值定位子元素。使用 DockPanel..::.Dock 附加屬性和這種定位功能事實上是 DockPanel 類的激動人心的一面。

在 Windows Presentation Foundation (WPF) 中,所有附加屬性還作為依賴項屬性來實現。

附加事件使用類似的所有者類型.事件名 屬性語法形式。就像非附加事件一樣,XAML 中的附加事件的屬性值指定在元素上處理事件時調用的處理程序方法的名稱。

使用附加事件的一種方案適用于可在任何元素(如鼠標按鈕)上處理的設備輸入事件。例如,Mouse..::.MouseDown 就是這樣一個附加事件。但是,大多數 WPF 框架級元素可以使用此事件,而無需使用附加事件。這是因為基元素類 UIElement 可為 Mouse..::.MouseDown 附加事件創建一個別名,并在 UIElement 成員表中公開該別名(為 MouseDown)。因此,通常不需要在 XAML 頁或 Windows Presentation Foundation (WPF) 應用程序編程中指定附加事件語法。例外情況包括,您使用的是自定義元素,或者使用并非從 UIElement 派生但仍然具有可視化表示形式的對象元素(這些情況很少見)。在 WPF 中,所有附加事件還作為路由事件來實現。ContentElement 也為輸入事件公開別名,供流程文檔模型使用。

XAML 頁面根元素剖析 下表顯示了一個典型的 XAML 頁面根元素分解結構,并顯示了本主題中介紹的根元素的具體屬性:

基類和 XAML 基礎 XAML 及其架構是一個類集合,這些類對應于 CLR 對象以及要在 XAML 中使用的標記元素。但是,并不是所有的類都能映射到元素。抽象類(如 ButtonBase)和某些非抽象基類在 CLR 對象模型中用于繼承,并且不支持對應的 XAML 標記。基類(包括抽象類)對于 XAML 開發仍然很重要,因為每個具體的 XAML 元素都從其層次結構中的某個基類繼承成員。通常,這些成員包括可以設置為元素屬性 (Attribute) 的屬性 (Property),或者可以處理的事件。FrameworkElement 是 WPF 在 WPF 框架級的具體 UI 基類。設計 UI 時,您將使用各種形狀、面板、修飾器或控件類,它們全部從 FrameworkElement 派生而來。有一個相關的基類 FrameworkContentElement,它使用可在 FrameworkElement 中特意鏡像 API 的 API,支持適合流布局表示形式的面向文檔的元素。元素級的屬性 (Attribute) 和 CLR 對象模型的組合提供了一組通用的屬性 (Property),可以在大多數具體的 XAML 元素上設置這些屬性 (Property),而不管確切的元素類型及其基礎類是什么。

XAML 安全性 XAML 是一種直接表示對象實例化和執行的標記語言。因此,使用 XAML 創建的元素能夠像等效的生成代碼那樣與系統資源進行交互(如網絡訪問、文件系統 IO)。

WPF 支持 .NET 安全框架代碼訪問安全性 (CAS)。這意味著在 Internet 區域中運行的 WPF 內容具有更少的執行權限?!八缮?XAML”(由 XAML 查看器在加載時解釋的未編譯 XAML 的頁面)和 XAML 瀏覽器應用程序 (XBAP) 通常在此 Internet 區域中運行,并且使用相同的權限集。但是,加載到完全受信任的應用程序中的 XAML 與宿主應用程序具有相同的系統資源訪問權限。有關更多信息,請參見 Windows Presentation Foundation 部分信任安全性。

從代碼中加載 XAML XAML 可用于定義整個 UI,但有時也適合只使用 XAML 定義 UI 的一部分。利用此功能可以實現部分自定義、在本地存儲信息、使用 XAML 提供業務對象或者各種可能的方案。這些方案的關鍵是 XamlReader 類及其 Load 方法。輸入是一個 XAML 文件,而輸出是一個對象,它表示從該標記中創建的對象的整個運行時樹。然后您可以插入該對象,作為應用程序中已存在的另一個對象的屬性。只要該屬性在具有最終顯示功能并且將通知執行引擎已在應用程序中添加新內容的內容模型中是一個合適的屬性,您就可以通過以 XAML 形式加載來輕松地修改正在運行的應用程序的內容。請注意,通常只在完全受信任的應用程序中使用此功能,因為將文件加載到正在運行的應用程序中會帶來明顯的安全隱患。

接下來的內容 本主題簡單介紹了 XAML 語法概念和術語。

如果您尚未了解這些內容,請嘗試閱讀 Windows Presentation Foundation 入門教程。當您真正創建本教程中介紹的標記應用程序時,其中的練習將幫助您進一步了解本主題中介紹的許多概念。

WPF 使用一個特定的應用程序模型,該模型基于 Application 類。

生成 WPF 應用程序 (WPF) 為您詳細介紹了如何通過命令行以及使用 Microsoft Visual Studio 生成包含 XAML 的應用程序。

依賴項屬性概述詳細介紹了 Windows Presentation Foundation (WPF) 中屬性的多樣性,并介紹了依賴項屬性的概念。

最后,SDK 中還包含一個稱為 XAMLPad 的 XAML 編輯工具。您可以使用此工具實時體驗 XAML。

?摘自:http://developer.51cto.com/art/200808/87148.htm

轉載于:https://www.cnblogs.com/h20064528/archive/2012/09/27/2706299.html

總結

以上是生活随笔為你收集整理的WPF基础之XAML的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。