新聞中心
在Silverlight里面建自定義控件(Templated Control),會(huì)在工程下生成一個(gè)Themes文件夾,并在其中包含一個(gè)generic.xaml文件。這是一個(gè)ResourceDictionary文件,所有的自定義控件的默認(rèn)樣式(Default Style)都必須放在這里。

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比牧野網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式牧野網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋牧野地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。
最原始的辦法就是把所有樣式都直接寫在generic.xaml文件里,但如果自定義控件足夠多,generic.xaml 達(dá)到了好幾千行,管理起來(lái)當(dāng)然十分麻煩。后來(lái)在同事的推薦下,得到兩種方法可以將各自定義控件的樣式分開(kāi)管理,總算解決了這一令人頭疼的問(wèn)題。
MergeDefaultStyle方法
如果研究過(guò)Silverlight Toolkit的源代碼,會(huì)發(fā)現(xiàn)里面所有的自定義控件都有一個(gè)單獨(dú)的xaml文件來(lái)保存控件的默認(rèn)樣式,當(dāng)然這些文件是不起作用的。最初以為是先用單獨(dú)的xaml文件來(lái)寫控件樣式,然后再拷貝到generic.xaml里,也就是人工同步。
然而現(xiàn)在發(fā)現(xiàn)MergeDefaultStyle方法。MergeDefaultStyle就是通過(guò)給所有單獨(dú)的xaml文件應(yīng)用一種特殊的 Build 方法,在 Build 工程的時(shí)候,自動(dòng)把 xaml 文件的內(nèi)容整合到 generic.xaml 里去。
重點(diǎn)步驟是:
1. 拷貝里面的代碼或者直接下載MergeDefaultStyle.dll。
2. 在VS里面Unload你的工程,然后編輯工程文件,或者直接用文本編輯器打開(kāi)csproj文件。
3. 在最后加上下面這段代碼:
- TaskName="Engineering.Build.Tasks.MergeDefaultStylesTask"
- AssemblyFile="$(EngineeringResources)\Engineering.Build.dll" />
注意:AssemblyFile 的值是你放MergeDefaultStyle.dll的位置,可以用相對(duì)路徑。
4. 再在后面加上這一段代碼:
- MergeDefaultStyles;
- $(PrepareResourcesDependsOn);
- Name="MergeDefaultStyles"
- Inputs="@(DefaultStyle)"
- Outputs="$(MSBuildProjectDirectory)\generic.xaml">
- DefaultStyles="@(DefaultStyle)"
- ProjectDirectory="$(MSBuildProjectDirectory)" />
- TouchDefaultStyles;
- $(RebuildDependsOn);
5. 重新 Load 你的工程。
6. 選擇有默認(rèn)樣式的單獨(dú)的xaml,在屬性窗口的 Build Action 里面選擇 DefaultStyle 。
7. 編譯整個(gè)工程,再打開(kāi)generic.xaml文件,你會(huì)發(fā)現(xiàn) xaml 文件里的內(nèi)容已經(jīng)拷到generic.xaml里面了。
這一方法適用于Silverlight 3及Silverlight 4 。
MergedDictionary方法
上面的方法可謂是一勞永逸了,但多少有點(diǎn)不官方。而且其實(shí)還是generic.xaml掌控全局,一旦一個(gè)xaml文件出了紕漏,會(huì)影響所有的控件跟著出錯(cuò)。這樣排查起來(lái)也麻煩的很。
于是在Silverlight 3里就出來(lái)了一個(gè)更簡(jiǎn)單更官方的方法。如前所述,generic.xaml文件包含了一個(gè)ResourceDictionary,而Silverlight 3里面的ResourceDictionary 多了一個(gè)MergedDictionaries的屬性,可以把其他ResourceDictionary通過(guò)資源路徑整合到一個(gè)ResourceDicionary里面。
其實(shí)新建一個(gè)Silverlight導(dǎo)航應(yīng)用時(shí),就可以在App.xaml 里面看到這一屬性的應(yīng)用。需要注意的是,在 App.xaml 里面是可以用相對(duì)路徑的,而在 generic.xaml 里面,不可以用相對(duì)路徑,而應(yīng)當(dāng)用 "/AssemblyName;component/path”的方法說(shuō)明文件路徑。
比如你的工程的AssemblyName是Slippor.Controls,而xaml的路徑是CustomControl文件夾下的CustomControl.xaml 。則應(yīng)該在generic.xaml里面如下寫:
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
這一方法適用于Silverlight 3及Silverlight 4。
原文作者:smjack
原文地址:http://www.cnblogs.com/smjack/archive/2010/08/24/1807706.html
文章標(biāo)題:Silverlight自定義控件管理二重奏
地址分享:http://m.fisionsoft.com.cn/article/cdideee.html


咨詢
建站咨詢
