Silverlight自定义控件管理二重奏
创始人
2024-07-13 11:01:39
0

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

最原始的办法就是把所有样式都直接写在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

【编辑推荐】

  1. 全屏模式下处理Silverlight控件的两种方式
  2. 细数Silverlight 4的十二大引人注目新特性
  3. Silverlight 4中XAML解析的变化

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
规避非法攻击 用好路由器远程管... 单位在市区不同位置设立了科技服务点,每一个服务点的员工都通过宽带路由器进行共享上网,和单位网络保持联...
范例解读VB.NET获取环境变... VB.NET编程语言的使用范围非常广泛,可以帮助开发人员处理各种程序中的需求,而且还能对移动设备进行...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...