闲话WPF之七(XAML的向前兼容性)
同樣地,我們用一個簡單的例子來幫助說明XAML的向前兼容性。假設有一個自定義的CLYLButton,實現了一個Light屬性。在V1版本它的默認屬性值是Blue(藍光)。在V2版本中支持屬性值Green(綠光)。假設我們在程序中利用Light屬性實現了綠光效果。但是,如果恰好目標機器上的V2版本意外地被替換為了V1版本。此時,程序的行為應該怎么樣呢?崩潰,不,我們希望它在沒有V2的情況下能利用V1版本的默認值實現藍光效果。如何實現且看XAML標記的向前兼容性。向前兼容性表示通過標記兼容性名字空間的Ignorable屬性標識元素、屬性和類,使它們可以動態的支持向前版本。
<CLYLButton V2:Light="Green"?
????? xmlns="...assembly-v1-uri..."
????? xmlns:V2="...assembly-V2-uri..."
????? xmlns:mc=http://schemas.micrsoft.com/winfx/2006/markup-compatibility
????? mc:Ignorable="V2" />
這就利用了標記兼容性名字空間的Ignorable屬性。mc:Ignorable=”V2”表示所有用V2前綴關聯的名字空間中元素或者屬性都是可以忽略的。如果現在只有V1版本的CLYLButton,上面的代碼就被XAML加載器解釋為:
<CLYLButton?Light=”Blue” xmlns=”… assembly-V1-uri …”/>
如果現在有V2版本的CLYLButton,上面的代碼將被XAML加載器解釋為:
<CLYLButton Light=”Green” xmlns=”… assembly-V2-uri …”/>
XMAL標記兼容性除了可應用在屬性上,還可以應用在元素之上。仍然通過例子進行說明,定義如下的一個類:
[ContentProperty("Buttons")]
??? public class CElement {
??????? List<CLYLButton> _buttons = new List<CLYLButton>();
??????? public List<CLYLButton> Buttons { get { return _buttons; }
}
關于ContentProperty的用法可以參考MSDN文檔ContentPropertyAttribute Class
同樣,我們可以如下編寫XAML代碼,使其可以同時兼容兩個版本的CElement。
<CElement mc:Ignorable="V2"
????? xmln="...assembly-v1-uri..."
????? xmlns:V2="...assembly-V2-uri..."
????? xmlns:mc="http://schemas.micrsoft.com/winfx/2006/markup-compatibility">
????? <CLYLButton Light="Blue" />
????? <V2:CLYLButton Light="Green"/>
</CElement>
這樣,如果加載器有V2版本,則Green屬性值生效。如果沒有則被忽略。類似地,我們還可以完全自動地處理名字空間的類:
<CElement mc:Ignorable="v2"
????? xmln="...assembly-v1-uri..."
????? xmlns:V2="...assembly-v2-uri..."
????? xmlns:mc="http://schemas.micrsoft.com/winfx/2006/markup-compatibility">
????? <V2:Favor/>
</CElement>
加載時,如果沒有V2版本存在,Favor類實例同樣將被忽略。
在Markup Compatibility中,除了有前面介紹的Comment、Ignorable屬性修飾外,另一個有趣的就是AlternateContent。利用AlternateContent,我們能方便的實現可選內容。比如,我們的程序使用了V2版本Assembly的CLYLButton類,但是,如果沒有找到這個Assembly,那么它對應的內容自動用另一個指定版本V1替換,而不是兼容性體現的忽略。看下面的例子:
<CElement mc:Ignorable="v2"
????? xmln="...assembly-v1-uri..."
????? xmlns:v2="...assembly-v2-uri..."
????? xmlns:mc="http://schemas.micrsoft.com/winfx/2006/markup-compatibility">
????? <mc:AlternateContent>
??????????? <mc:Choice Requires="V2">
????????????????<CLYLButton Light="Green" Shape="Dog" />
??????????????? <V2:Favor/>
??????????? </mc:Choice>
??????????? <mc:Fallback>
??????????????? <CLYLButton Light="Blue"/>
??????????? </mc:Fallback>
???????</mc:AlternateContent>
</CElement>
這一段XAML代碼在有V1版本的Assembly時將被視為:
<CElement xmln="...assembly-v1-uri...">
??????? <CLYLButton Light="Blue"/>
</CElement>
如果有V2版本的Assembly,編譯的結果如下:
<CElement xmln="...assembly-v1-uri...">
??????? <CLYLButton Light="Green"/>
?????? <Favor/>
</CElement>
轉載于:https://www.cnblogs.com/YilingLai/archive/2006/12/21/599117.html
總結
以上是生活随笔為你收集整理的闲话WPF之七(XAML的向前兼容性)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [导入]Vista的屏幕截图小工具:Sn
- 下一篇: 发光文字