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 ^