WinUI3中如何实现DataGridTextColumn控件的本地化?
WinUI3 替代WPF x:Static 实现本地化的解决方案
你可以通过以下三种常用方式实现和原WPF版本等价的本地化效果:
1. 使用WinUI3原生x:Uid标记(官方推荐,迁移成本最低)
这是WinUI3内置的本地化方案,无需额外编写自定义逻辑:
- 首先按WinUI3规范组织资源文件:在项目根目录创建
Strings文件夹,下按语言区分子文件夹(如en-US、zh-CN),每个子文件夹下存放.resw资源文件(默认命名为Resources.resw) - 在资源文件中添加键值对:键名按
[控件Uid名].[属性名]格式配置,例如你需要给DataGrid列的Header赋值,资源键可以写为DwApplicationIdColumn.Header,值为对应的本地化文本 - XAML代码直接替换为:
<DataGridTextColumn x:Uid="DwApplicationIdColumn" Binding="{Binding Id}"/>
WinUI3会自动根据当前系统语言加载对应资源,赋值给对应属性。
2. 自定义标记扩展(兼容原WPF的写法习惯)
如果你希望保留和原x:Static类似的调用写法,可以自己实现一个资源加载标记扩展:
- 先编写自定义Markup扩展类:
using Microsoft.UI.Xaml.Markup; using Windows.ApplicationModel.Resources; namespace YourAppNamespace { [MarkupExtensionReturnType(ReturnType = typeof(string))] public class LocResourceExtension : MarkupExtension { public string Key { get; set; } protected override object ProvideValue(IXamlServiceProvider serviceProvider) { return ResourceLoader.GetForCurrentView().GetString(Key); } } }
- 在XAML中引入命名空间后直接调用,写法和原WPF版本高度一致:
<DataGridTextColumn Header="{local:LocResource Key=DwApplicationId}" Binding="{Binding Id}"/>
3. ViewModel绑定(适合MVVM架构项目)
如果你使用MVVM模式开发,可以把资源字符串封装到ViewModel属性中直接绑定:
- 在ViewModel中定义属性:
public string DwApplicationId => ResourceLoader.GetForCurrentView().GetString("DwApplicationId");
- XAML中直接绑定该属性:
<DataGridTextColumn Header="{Binding DwApplicationId}" Binding="{Binding Id}"/>
注意事项
- 资源文件的生成操作需设置为
PRIResource,否则会出现资源找不到的问题 - 如果需要在非UI线程加载资源,替换
ResourceLoader.GetForCurrentView()为ResourceLoader.GetForViewIndependentUse()即可
内容的提问来源于stack exchange,提问作者Sascha Manns
相关产品推荐
相关产品推荐

