XAML 剖析器架構
WPF Designer for Visual Studio 會載入可延伸應用程式標記語言 (XAML) 文件,並建立要在 Visual Studio 中顯示的 WPF 物件。 載入時所發生的錯誤,會顯示在 [錯誤清單] 視窗中。
XAML 載入階段
WPF Designer會載入 XAML 文件,並建立一個對應的「抽象語法樹狀結構」(Abstract Syntax Tree,AST)。 AST 是一種資料結構,代表已剖析過的 XAML。 這是一個有限、已標記、導向的樹狀結構,其中的內部節點會標示運算子,而分葉節點則代表節點運算子的運算元。 這些分葉節點具有零元運算子,這些運算子可以是變數或常數。
有一系列的階段會載入 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 SomeProperty="Mark">),就是一種無效的 XAML。
這些傳遞包括型別解析,因此可以針對項目型別驗證這些資訊 (例如項目名稱及屬性名稱)。 例如,剖析器會檢查 SomeProperty 是否為 Button 上的屬性。 遺漏型別會導致錯誤。
這個剖析器會嘗試錯誤復原,所以在剖析文件時,一次可能會報告多個錯誤。 但是,並非所有可能的錯誤都會報告。 例如,如果有一個項目名稱拼錯字,且該項目中的屬性名稱也拼錯字,則一開始只會報告項目錯誤,因為在正確解析該項目前,無法驗證屬性的名稱。
注意
這個階段並不包含屬性值的驗證。例如,在這個階段期間,不會偵測到 <Button Background="xBlue"/>。請參閱本主題稍後的討論內容。
模型和物件執行個體化
在語法驗證要結束時,有一個對應到 XAML 的 AST,這個 XAML 特定的文件樹狀結構作用就如同該 AST 中的檢視或游標。
在最後一個階段,模型和基礎執行個體都會執行個體化,並從字串轉換成屬性值並予以指派。 剖析器會使用文件樹狀結構管理員類別建立文件樹狀結構,以達到這個目的。 建立 XAML 的文件樹狀結構時,也會建立基礎 WPF 執行個體。 這些執行個體在設計工具中係做為檢視使用。
建立模型和執行個體時,如果引發了例外狀況,則針對發生錯誤之節點的子系建立任何物件便都不會完成了。 模型係針對樹狀結構的其餘部分建構的。 這麼做會盡可能多公開一些錯誤。
例如,在程式碼片段中,<Button Background="Test"/> (Brush 型別的 TypeConverter) 會嘗試將 Test 轉換成 Brush 執行個體。 因為 Test 並不是有效的 Brush 值,所以型別轉換子會引發例外狀況暫停任何子節點的剖析程序,但是例外狀況不會影響文件其餘部分的剖析。
當主控物件執行個體化時,會從字串中轉換屬性值。 當設計介面上使用主控物件時,就會發生這個情況。 許多值範圍的錯誤要到父物件使用於設計工具時才會報告。
這個行為類似 WPF 編譯。 WPF 編譯器不會在編譯期間驗證或嘗試轉換屬性 (Attribute 或 Property) 值。 要到 WPF 在執行階段將物件樹狀結構執行個體化時,才會呼叫型別轉換子。
注意
載入外部資源字典時,編輯模型和剖析器之間會產生互動。當編輯模型必須載入其他 XAML 檔案時,會觸發 XAML 載入作業。
錯誤訊息
WPF Designer的錯誤訊息說明主題會說明哪些 XAML 載入階段引發了錯誤。 下表說明訊息與階段的對應關係。
XAML 載入階段 |
錯誤訊息 |
---|---|
XML 語法驗證 |
當 XAML 檔案不是語法正確的 XML 文件,就會引發這個錯誤。 |
XAML 語法驗證 |
當檔案是有效的 XML 文件卻不是語式正確的 XAML 文件時,就會引發這個錯誤。 |
模型和物件執行個體化 |
當檔案是語式正確的 XAML 文件,但內含一個或多個型別不相符時,就會引發這個錯誤。 |