Share via


XamlWriter.Save 的序列化限制

API Save 可用來將 Windows Presentation Foundation (WPF) 應用程式的內容序列化為可延伸的應用程式標記語言 (XAML) 檔案。 不過,究竟要將哪些項目序列化,則有一些值得注意的限制。 本主題將說明這些限制及一些一般考量。

執行階段而非設計階段的表示法

呼叫所序列化之專案的基本原理是,結果是在執行時間序列化 Save 物件的標記法。 原始 XAML 檔案的許多設計階段屬性可能會在 XAML 載入為記憶體內建物件時優化或遺失,而且當您呼叫 Save 序列化時不會保留。 序列化的結果是應用程式建構邏輯樹狀結構的有效標記法,但不一定是產生它的原始 XAML。 這些問題使得將序列化作為廣泛 XAML 設計介面的一部分極為困難 Save

序列化是獨立的

的序列化輸出 Save 是獨立的;序列化的所有專案都包含在 XAML 單一頁面內,具有單一根項目,而且沒有 URI 以外的外部參考。 例如,如果您的頁面會參考來自應用程式資源的資源,這些資源的顯示方式,就像它們是要序列化的頁面元件一樣。

延伸模組參考已取值

透過各種不同標記延伸格式 (例如 StaticResourceBinding) 對物件所做的一般參考,將透過序列化程序來取值。 這些已在應用程式執行時間建立記憶體內建物件時取值,而且 Save 邏輯不會重新流覽原始 XAML,以還原序列化輸出的這類參考。 這可能會凍結任何資料繫結或資源取得的值,以做為執行階段表示法上一次使用的值,只透過有限或間接的方式來區分這類值與本機設定的任何其他值。 影像也會序列化為影像的物件參考,因為它們存在於專案中,而不是原始來源參考,遺失原本參考的任何檔案名或 URI。 實際上已將在同一個頁面內宣告的資源序列化至參考它們的點,而不是保留為資源集合的關鍵字。

不會保留事件處理

透過 XAML 新增的事件處理常式序列化時,不會保留它們。 沒有程式碼後置的 XAML(也不含相關的 x:Code 機制)無法序列化執行時間程式邏輯。 由於序列化是獨立且受限於邏輯樹狀結構,所以,沒有任何功能可用來儲存事件處理常式。 因此,事件處理常式屬性本身和命名處理常式的字串值都會從輸出 XAML 中移除。

使用 XAMLWriter.Save 的真實案例

雖然此處所列的限制相當龐大,但仍有數個適合用於 Save 序列化的案例。

  • 向量或圖形輸出︰重新載入時,可以使用轉譯區域的輸出,重新產生相同的向量或圖形。

  • Rich Text 格式和非固定格式文件︰輸出中會保留文字與所有已格式化的元素及其內部的元素內含項目。 這適用於估計剪貼簿功能的機制。

  • 保留商務物件資料:如果您已將資料儲存在自訂元素中,例如 XML 資料,只要您的商務物件遵循基本 XAML 規則,例如提供自訂建構函式和參考屬性值的轉換,這些商務物件就可以透過序列化來延續。