天天看點

一起談.NET技術,Silverlight 自定義控件模闆管理  MergeDefaultStyle 法  MergedDictionary 法

  在 Silverlight 裡面建自定義控件(Templated Control),會在工程下生成一個Themes檔案夾,并在其中包含一個generic.xaml 檔案。這是一個 ResourceDictionary 檔案,所有的自定義控件的預設樣式(Default Style)都必須放在這裡。

  最原始的辦法就是把所有樣式都直接寫在 generic.xaml 檔案裡,但如果自定義控件足夠多,generic.xaml 達到了好幾千行,管理起來當然十分麻煩。後來在同僚的推薦下,搞到兩種方法可以将各自定義控件的樣式分開管理,總算解決了這一令人頭疼的問題。

  如果研究過 Silverlight Toolkit 的源代碼,會發現裡面所有的自定義控件都有一個單獨的 xaml 檔案來儲存控件的預設樣式,當然這些檔案是不起作用的。最初我以為是先用單獨的 xaml 檔案來寫控件樣式,然後再拷貝到 generic.xaml 裡,也就是人工同步。于是我就這麼做了……最終發現實在是很傻很天真,人工同步比被牆的 Dropbox 還不靠譜。

  後來發現了 MergeDefaultStyle 這個東東,才搞清楚之前原來是被耍了。

  MergeDefaultStyle 就是通過給所有單獨的 xaml 檔案應用一種特殊的 Build 方法,在 Build 工程的時候,自動把 xaml 檔案的内容整合到 generic.xaml 裡去。

  重點步驟是:

  2. 在VS裡面Unload你的工程,然後編輯工程檔案,或者直接用文本編輯器打開csproj檔案。

  3. 在最後加上下面這段代碼:

  注意:AssemblyFile 的值是你放MergeDefaultStyle.dll的位置,可以用相對路徑。

  4. 再在後面加上這一段代碼:

  5. 重新 Load 你的工程。

  6. 選擇有預設樣式的單獨的 xaml ,在屬性視窗的 Build Action 裡面選擇 DefaultStyle 。

  7. 編譯整個工程,再打開 generic.xaml 檔案,你會發現 xaml 檔案裡的内容已經拷到 generic.xaml 裡面了。

  這一方法适用于 Silverlight 2\3\4 。

  上面的方法可謂是一勞永逸了,但多少有點不官方。而且其實還是 generic.xaml 掌控全局,一旦一個 xaml 檔案出了纰漏,會影響所有的控件跟着出錯。這樣排查起來也麻煩的很。

  于是在 Silverlight 3 裡就出來了一個更簡單更官方的方法。如前所述,generic.xaml 檔案包含了一個ResourceDictionary,而 Silverlight 3 裡面的 ResourceDictionary 多了一個 MergedDictionaries 的屬性,可以把其他 ResourceDictionary 通過資源路徑整合到一個 ResourceDicionary 裡面。

  其實建立一個 Silverlight 導航應用時,就可以在 App.xaml 裡面看到這一屬性的應用。需要注意的是,在 App.xaml 裡面是可以用相對路徑的,而在 generic.xaml 裡面,不可以用相對路徑,而應當用 "/AssemblyName;component/path”的方法說明檔案路徑。

  比如你的工程的 AssemblyName 是 Slippor.Controls,而 xaml 的路徑是 CustomControl 檔案夾下的CustomControl.xaml 。則應該在 generic.xaml 裡面如下寫:

  這一方法适用于 Silverlight 3\4 。