XAML 剖析器架構

更新:2007 年 11 月

Windows Presentation Foundation (WPF) Designer for Visual Studio 會載入可延伸應用程式標記語言 (XAML) 文件,並建立要在 Visual Studio 中顯示的 WPF 物件。 載入時所發生的錯誤,會顯示在 [錯誤清單] 視窗中。

XAML 載入階段

WPF 設計工具會載入 XAML 文件,並建立一個對應的「抽象語法樹狀結構」(Abstract Syntax Tree, AST)。AST 是一種資料結構,代表已剖析過的 XAML。這是一個有限、已標記、導向的樹狀結構,其中的內部節點會標示運算子,而分葉節點則代表節點運算子的運算元。這些分葉節點具有與 null 有關的運算子,這些運算子可以是變數或常數。

有一系列的階段會載入 XAML 文件,如下表的說明。

XAML 載入階段

描述

XML 語法驗證

掃描器:語彙傳遞,會檢查任何格式不正確、無效的字元,並建立語彙基元。

剖析器:建立 AST 並執行成對分析,以確保標記的格式正確且對稱。

XAML 語法驗證

ConvertToXaml 會查詢所有型別,將型別資訊放入至 XAML AST,然後標註 XAML AST。

驗證會執行錯誤檢查,並檢查樹狀結構中的節點位置。

模型和物件執行個體化

個別逐步完成 AST 的不同階段,此階段會建立編輯模型和 WPF 物件。

若節點在之前的階段有產生錯誤就會標示為有錯誤,而且任何後續的階段都不會再經過這個節點。如果在「掃描器」和「剖析器」階段發生錯誤,就不會嘗試執行「模型和物件執行個體化」階段。

XML 語法驗證

「掃描器」和「剖析器」階段會驗證要載入的文件是否為格式正確的 XML 文件,其中不含 XML 語法錯誤。例如,使用 <Button> 標記卻沒有對稱的 </Button> 結束標記,就是一種 XML 語法錯誤。因為這個剖析器會嘗試錯誤復原,所以在剖析文件時,一次可能會報告多個錯誤。

XAML 語法驗證

剖析器會在不同的傳遞中周遊 XML AST,以確認文件是有效的 XAML 文件,這表示該文件要符合 XAML XML 結構描述且不含無效的 XAML。例如,使用無效之屬性宣告的項目 (例如 <Button Foo="Mark">),就是一種無效的 XAML。

這些傳遞包括型別解析,因此可以針對項目型別驗證這些資訊 (例如項目名稱及屬性名稱)。例如,剖析器會檢查 Foo 是否為 Button 上的屬性。遺漏型別會導致錯誤。

這個剖析器會嘗試錯誤復原,所以在剖析文件時,一次可能會報告多個錯誤。但是,並非所有可能的錯誤都會報告。例如,如果有一個項目名稱拼錯字,且該項目中的屬性名稱也拼錯字,則一開始只會報告項目錯誤,因為在正確解析該項目前,無法驗證屬性的名稱。

注意事項:

這個階段並不包含屬性值的驗證。例如,在這個階段期間,不會偵測到 <Button Background="xBlue"/>。請參閱本主題稍後的討論內容。

模型和物件執行個體化

在語法驗證要結束時,有一個對應到 XAML 的 AST,這個 XAML 特定的 DocumentTree 作用就如同該 AST 中的檢視或游標。

在最後一個階段,模型和基礎執行個體都會執行個體化,並從字串轉換成屬性值並予以指派。剖析器會使用 ModelDocumentTreeManager 類別建立 DocumentTree,以達到這個目的。建立 XAML 的 DocumentTree 時,也會建立基礎 WPF 執行個體。這些執行個體在設計工具中係做為檢視使用。

建立模型和執行個體時,如果引發了例外狀況,則針對發生錯誤之節點的子系建立任何物件便都不會完成了。模型係針對樹狀結構的其餘部分建構的。這麼做會盡可能多公開一些錯誤。

例如,在程式碼片段中,<Button Background="Test"/> (Brush 型別的 TypeConverter) 會嘗試將 Test 轉換成 Brush 執行個體。因為 Test 並不是有效的 Brush 值,所以型別轉換子會引發例外狀況暫停任何子節點的剖析程序,但是例外狀況不會影響文件其餘部分的剖析。

當主控物件執行個體化時,會從字串中轉換屬性值。當設計介面上使用主控物件時,就會發生這個情況。許多值範圍的錯誤要到父物件使用於設計工具時才會報告。

這個行為類似 WPF 編譯。WPF 編譯器不會在編譯期間驗證或嘗試轉換屬性 (Attribute 或 Property) 值。要到 WPF 在執行階段將物件樹狀結構執行個體化時,才會呼叫型別轉換子。

注意事項:

載入外部資源字典時,編輯模型和剖析器之間會產生互動。當編輯模型必須載入其他 XAML 檔案時,會觸發 XAML 載入作業。

錯誤訊息

WPF 設計工具的錯誤訊息說明主題會說明哪些 XAML 載入階段引發了錯誤。下表說明訊息與階段的對應關係。

XAML 載入階段

錯誤訊息

XML 語法驗證

當 XAML 檔案不是語法正確的 XML 文件,就會引發這個錯誤。

XAML 語法驗證

當檔案是有效的 XML 文件卻不是語式正確 (Well-Formed) 的 XAML 文件,就會引發這個錯誤。

模型和物件執行個體化

當檔案是語式正確的 XAML 文件,但內含一個或多個型別不相符時,就會引發這個錯誤。

請參閱

概念

XAML 錯誤和說明

參考

DocumentTree

ModelDocumentTreeManager

其他資源

WPF 設計工具的錯誤訊息參考

XAML

使用資源