silverlight:Silverlight 下换肤的实现

  本文举例源代码或素材下载

  Silverlight 目前Control控件要改变外观般都通过 Style="{StaticResource SomeStyle}" 来指定而不能统设置个默认 Style. 为了重用般把 Style 都放到 App.xaml Resources 字典中去而 Style 定义往往非常冗长这样 App.xaml 就会变得非常臃肿修改维护都很麻烦并且还不能支持多个Control控件批量切换 Style 总的弊端非常多

  幸好 Nikhil Kothari 想了个办法解决了这个问题在使用方式上借鉴了 asp.net Theme 机制只要在 Silverlight 根目录下定义个 Themes 目录并按要求往其中放入相关皮肤文件即可这里建议方式是每个Control控件个单独 xaml, 其中放了个 UserControl. 的所以用 UserControl 是为了能用 Expression Blend 进行可视化设计非常直观

  主要实现思想:

  1. 继承了个自定义 App 子类. 使用者需要将现有 App.xaml 改成使用该类才行

  (同时这个 App 类还实现了根据 initParameters 在 xaml 中动态指定加载 UserControl 和 Theme 功能)

   其中设置个 ThemeName 属性来定义 Theme 名称

  2. 在 App 启动时根据这个属性名动态去加载相关 xaml xml 文件并解析的这些皮肤 xaml 文件在 VS 里是要把 Build Action 设置成 Content 这样可以生成到 xap 包里去以便于加载

  3. 在读取多个 xaml 文件并解析过程中对同样 Style 根据优先级做了相应覆盖合并最终形成个总 xaml 文件内容

  4. 用 XamlReader Load 思路方法加载最终文档将其中资源都抽取出来并塞到 App.Resources 字典里去

  5. 然后正常Control控件视觉树开始创建其中视觉元素指定了 StaticResource 样式这时它就能从 App 资源字典里获取到皮肤样式

  注意:这里自始至终没有动态对Control控件指定 Style 机制 Silverlight 目前不支持

  这个解决方案主要思想就是在视觉树加载的前动态修改了 App 中资源后续样式应用机制仍然是 framework 默认

Tags:  silverlight2 silverlight.2.0 silverlight是什么 silverlight

延伸阅读

最新评论

发表评论