[Silverlight] 改进 Nikhil Kothari 的换肤方案:允许自定义控件的皮肤定义

Silverlight 下换肤的实现 中,我介绍了 Nikhil Kothari 实现的一种 Theme 方案。但是实践了一下,我很快发现有个小小的缺陷。作者的皮肤定义是仅针对系统自带的控件的,如 Button, TextBox, CheckBox 等,而对于我们自定义的控件的换肤问题没有很好的解决。从下列代码中可见一斑:

(/Framework/Applications/Theme.cs)
public   string  GetXml() {
    
string  resourceDictionaryFormat  =
@" <UserControl 
xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""
xmlns:vsm=""clr-namespace:System.Windows;assembly=System.Windows"">
<UserControl.Resources>
{0}
</UserControl.Resources>
</UserControl>
" ;

    _content.Replace(
@" xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" " "" );
    _content.Replace(
@" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" " "" );
    _content.Replace(
@" xmlns:vsm=""clr-namespace:System.Windows;assembly=System.Windows"" " "" );

    
return  String.Format(resourceDictionaryFormat, _content.ToString());
 }

可以看出这里名称空间都是写死了的,不支持任何扩展。
而实际使用中,我们可能会对某个第三方控件定义样式。比如:

< UserControl
    
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d
="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc
="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:liquid
="clr-namespace:Liquid;assembly=Liquid"
    mc:Ignorable
="d"
    x:Class
="UserControl"
    d:DesignWidth
="640"  d:DesignHeight ="480" >
    
< UserControl.Resources >
        
< Style  x:Key ="MyLiquidDialog"  TargetType ="liquid:Dialog" >
            
<!--  略  -->
        
</ Style >     
    
</ UserControl.Resources >

    
< Grid  x:Name ="LayoutRoot"  Background ="White"   />
</ UserControl >

这里定义了 Liquid 这套组件中 Dialog 控件的样式,而其中 xmlns:liquid 这个名称空间的声明就是必须的。

要达到这个目标,我们可以修改 Theme.cs 的 parse 步骤,在其过程中补充一段收集 xml namespace 的代码,并在合并最终的样式 xaml 时加进去即可。

修改过的 Theme.cs 代码如下:

修改过的 Theme.cs


其中 灰色部分是主要修改的代码。这样改过后,重新编译 Nikhil Kothari 的 Framework 项目,并把生成的 dll 引用到自己项目中即可支持第三方控件的换肤了。

修改过的 DLL [ 下载]





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值