2011-12-21 61 views
3

我的應用程序使用內置.NET解決方案從內存中對象生成XAML文件:System.XamlServices.Save(Stream, Object) 但是,我得到的XAML受到嚴重污染。所有的屬性都是序列化的。 有沒有辦法告訴XAML序列化程序忽略保存其默認值的屬性?(我幾乎完全控制了序列化的類)調整對象圖的XAML序列化

Expression Blend解決了這個問題:如果我們不更改屬性,生成的XAML文件根本不會包含它。結果得到的XAML並沒有混淆所有可能的屬性及其默認值,並且看起來不像常規自動生成的混亂。我也想擁有美麗的XAML。

回答

1

要只用一個對象做到這一點:

一旦:

  • 請使用默認屬性的新對象
  • 它序列化到XAML
  • 加載到一個XML DOM
  • 遞歸通過每個子節點和子節點
  • 將每個節點保存到字典中,並使用節點的XPath關鍵字, innerXML的值。顯然,如果你有相同路徑的節點,這將不起作用,你將不得不限定它們。但在這種情況下,你可能不想修剪那些。
  • 你不需要這個對象了。調整它,保持字典。

對於每一個對象:

  • 序列化對象爲XAML
  • Loadit成XML DOM
  • 遞歸直通每個孩子和子子節點
  • 查找每個XPath在字典。
  • 如果innerXML相同,請在應該害怕的節點列表中注意這一點。
  • 完成遞歸後,顯示那些節點爲什麼害怕 - 刪除它們!
  • DOM應該有美麗的XAML。

我讓你有同樣的XPath在詞典中使嵌套對象更好地工作。這取決於你的物體是什麼以及它們是如何嵌套的,以便我能夠說出這些。祝你好運!

3

老問題,但我最近也有這個問題,它看起來像Xaml序列化器尊重DefaultValueAttribute

我沒有真正測試過任何版本,但.net 4。5,但我記得曾讀到這一篇文章,從2006年(即我不能找到現在不幸的是)

兩個其他屬性來尋找生產清潔XAML是ContentAttribute 允許perticular屬性爲「默認」當其他元素被指定爲該元素的直接子元素時,以及ContentWrapperAttribute,允許您指定使用哪種類型來包裝這些值(用於集合)