Silverlight自定义控件管理二重奏

在Silverlight里面建自定义控件(Templated Control),会在工程下生成一个Themes文件夹,并在其中包含一个generic.xaml文件。这是一个ResourceDictionary文件,所有的自定义控件的默认样式(Default Style)都必须放在这里。

创新互联公司-专业网站定制、快速模板网站建设、高性价比牧野网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式牧野网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖牧野地区。费用合理售后完善,10余年实体公司更值得信赖。

最原始的办法就是把所有样式都直接写在generic.xaml文件里,但如果自定义控件足够多,generic.xaml 达到了好几千行,管理起来当然十分麻烦。后来在同事的推荐下,得到两种方法可以将各自定义控件的样式分开管理,总算解决了这一令人头疼的问题。

MergeDefaultStyle方法

如果研究过Silverlight Toolkit的源代码,会发现里面所有的自定义控件都有一个单独的xaml文件来保存控件的默认样式,当然这些文件是不起作用的。最初以为是先用单独的xaml文件来写控件样式,然后再拷贝到generic.xaml里,也就是人工同步。

然而现在发现MergeDefaultStyle方法。MergeDefaultStyle就是通过给所有单独的xaml文件应用一种特殊的 Build 方法,在 Build 工程的时候,自动把 xaml 文件的内容整合到 generic.xaml 里去。

重点步骤是:

1. 拷贝里面的代码或者直接下载MergeDefaultStyle.dll。

2. 在VS里面Unload你的工程,然后编辑工程文件,或者直接用文本编辑器打开csproj文件。

3. 在最后加上下面这段代码:

 
 
 
  1.   TaskName="Engineering.Build.Tasks.MergeDefaultStylesTask" 
  2.   AssemblyFile="$(EngineeringResources)\Engineering.Build.dll" /> 

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

4. 再在后面加上这一段代码:

 
 
 
  1.  
  2.  
  3.    
  4.  
  5.  
  6.  
  7.    
  8.     MergeDefaultStyles;  
  9.     $(PrepareResourcesDependsOn);  
  10.    
  11.  
  12.   Name="MergeDefaultStyles" 
  13.   Inputs="@(DefaultStyle)" 
  14.   Outputs="$(MSBuildProjectDirectory)\generic.xaml"> 
  15.   
  16.     DefaultStyles="@(DefaultStyle)" 
  17.     ProjectDirectory="$(MSBuildProjectDirectory)" /> 
  18.  
  19.  
  20.  
  21.    
  22.     TouchDefaultStyles;  
  23.     $(RebuildDependsOn);  
  24.    
  25.  
  26.  
  27.    
  28.  

5. 重新 Load 你的工程。

6. 选择有默认样式的单独的xaml,在属性窗口的 Build Action 里面选择 DefaultStyle 。

7. 编译整个工程,再打开generic.xaml文件,你会发现 xaml 文件里的内容已经拷到generic.xaml里面了。

这一方法适用于Silverlight 3及Silverlight 4 。

MergedDictionary方法

上面的方法可谓是一劳永逸了,但多少有点不官方。而且其实还是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里面如下写:

 
 
 
  1. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
  2.    
  3.      
  4.    

这一方法适用于Silverlight 3及Silverlight 4。

原文作者:smjack

原文地址:http://www.cnblogs.com/smjack/archive/2010/08/24/1807706.html

网站名称:Silverlight自定义控件管理二重奏
新闻来源:http://www.36103.cn/qtweb/news21/32671.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联