Silverlight中本地化的实现(2)

         去年下半年去了一趟台湾后,似乎就再也没有写过博客,尽管在公司内部论坛上坚持发表一些文章,已经大多数与技术本身无关了. 刚进公司做Silverlight时,曾写了一篇 Silverlight中本地化的实现,一晃快三年过去我仍然做着Silverlight的工作,也见证这几年Silverlight在开发者或是社区的影响力由鼎盛到日渐式微,从大学学习Silverlight到目前,已经过了5年,比起国内大部分Silverlighter爱好者,开发者,我似乎更愿意去表达一种情怀,尽管我的工作本身还需要懂的一些WinForm,ASP.NET,WPF,WCF这些技术,我想我的程序员职业生涯是不会离开.NET这个圈了,但是以后的事情谁知道?也许过几年我开个小店,卖点奶茶,似乎也是不错.

        今天还想提笔写写对本地化中的改进,因为只是在之前一篇文章上的一点改进的,所以不见得有什么深度,但是出于分享的目的,还是希望对刚刚接触XAML的人有一些帮助.

        在上一篇的基础上,我们可以看到View上最后读取字符串是用了很长的XAML去编写:

      <TextBlock Height="23"
                         Name="textBlock1"
                         Text="{Binding ConverterParameter=Country,Converter={StaticResource Localization},Source={StaticResource Localization}}"
                         Width="90" />

       但是程序中这种语句很多的话,要不停的粘贴复制,可能就觉得十分的不方便,所以我的做法改进后就变成下面这样:

     <TextBlock Height="23"
                           Name="textBlock2"
                           local:AppResource.ResourceKey="Country"
                           Width="90" />

        你应该看出来了,对,这里是用的附加属性,我的博客里最近的几篇文章都有提及到它,所以重视一下附加属性还是很有必要的,因为掌握好了,确实能让你的XAML看起来更为优雅,简洁,

        实际上我对代码只是修改了很小的一部分,我贴出来大家自己看看就好:

     private static void OnResourceKeyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
     {
         var resourceKey = e.NewValue as string;
         if (resourceKey != null)
         {
             string resourceData = Get(resourceKey);
             if (resourceData != null)
             {
                 if (d is TextBlock)
                     (d as TextBlock).Text = resourceData;
                 if (d is TextBox)
                     (d as TextBox).Text = resourceData;
                   //其它控件
             }
                     }
 
     }
     public static string GetResourceKey(DependencyObject d) 
     { 
         return (string)d.GetValue(ResourceKeyProperty); 
     }
     public static void SetResourceKey(DependencyObject d, string value) 
     { 
         d.SetValue(ResourceKeyProperty, value);
     }
 
     public static readonly DependencyProperty ResourceKeyProperty =
         DependencyProperty.RegisterAttached("ResourceKey", typeof(string), typeof(AppResource), new PropertyMetadata(null, OnResourceKeyChanged));

       代码中加了一个ResourceKey的属性,虽然很短,但是应该还是很有用,其实这种情况也能用Silverlight5里面的MarkupExtension去做,所以还是看个人想法不同进行取舍.

       因为改动的代码量较少,就不上传文件了,希望这个小小的Tip给你带来一点帮助,其实只要是做XAML,这些技术不是都是通用么^  v ^

posted @ 2013-03-21 15:27  ringgo  阅读(831)  评论(2编辑  收藏  举报