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