WPF动态资源是一个比较庞大的数据资源。在这里我们就以一个范例为大家介绍一下有关WPF动态资源的相关应用方法,希望对大家有所帮助。#t#
刚好公司在进行一个WPF的内部项目,今天我的任务是让整个应用支持多语言(全球化)。我使用了WPF动态资源来存放mutil language数据。
resource文件如下:
- <ResourceDictionary xmlns="http:
//schemas.microsoft.com/winfx/
2006/xaml/presentation" - xmlns:x="http://schemas.microsoft.
com/winfx/2006/xaml" xmlns:sys=
"clr-namespace:System;assembly
=mscorlib"> - <sys:String x:Key="AllNews">
- 所有
- </sys:String>
- <sys:String x:Key="China">
- 中国
- </sys:String>
- <sys:String x:Key="World">
- 世界
- </sys:String>
- <sys:String x:Key="News">
- 新闻
- </sys:String>
- <sys:String x:Key="Other">
- 其他
- </sys:String>
- </ResourceDictionary>
对于各个业务组件的全球化十分简单,如
- <Button Height="23" Name="btnChina"
- Width="75" Click="Button_Click"
- Content="{DynamicResource China}">
但是对于主窗体来说,菜单是要通过读取各个业务组件的CustomAttribute来创建的。起初,我用的方法是直接从应用程序的WPF动态资源里找到对应的串。
(string)Application.Current.Resources.MergedDictionaries[0][key] 但是问题随之而来,当我切换language resource文件时,菜单上的内容并不会自动更新。既然WPF都用了DataBinding功能,总不能还用代码去更新菜单项吧。这违背了我们程序员的原则!
查阅了相关书籍,终于找到了WPF动态资源解决的方案,使用UIElement对象的SetResourceReference方法来实现{DynamicResource XXXX}的功能:
- item = new MenuItem();
- item.SetResourceReference
(MenuItem.HeaderProperty, key);- this.menuMain.Items.Add(item);