使用Avalonia与资源文件实现应用动态本地化切换不生效问题求助
AvaloniaUI Resx多语言动态切换不更新解决方案
核心问题根因
Avalonia绑定系统对INotifyPropertyChanged空属性名通知的处理逻辑与WPF存在差异,空属性名通知无法触发索引器绑定的批量更新,是本次问题的核心诱因。
修复步骤
1. 修正翻译源变更通知逻辑
修改TranslationSourceWithMultipleResxFiles类中CurrentCulture属性的setter,主动触发索引器的变更通知,替换原有的空属性名通知:
private CultureInfo _currentCulture; public CultureInfo CurrentCulture { get => _currentCulture; set { if (Equals(_currentCulture, value)) return; _currentCulture = value; // 触发索引器批量更新通知,适配Avalonia绑定规则 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(Binding.IndexerName)); // 可选:同步线程文化,保证后台逻辑也使用对应语言 Thread.CurrentThread.CurrentCulture = value; Thread.CurrentThread.CurrentUICulture = value; } }
2. 修正标记扩展的绑定配置
确保LocExtensionWithMultipleResxFiles返回的绑定显式指定了单向绑定模式,且绑定源指向单例实例:
[MarkupExtensionReturnType(typeof(string))] public class LocExtensionWithMultipleResxFiles : MarkupExtension { public string Key { get; set; } public override object ProvideValue(IServiceProvider serviceProvider) { return new Binding { Source = TranslationSourceWithMultipleResxFiles.Instance, Path = $"[{Key}]", Mode = BindingMode.OneWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged }; } }
3. 修正附加属性的继承配置
如果使用Translation附加属性指定资源管理器,需要开启属性的继承标志,保证子控件可以正确继承父级配置:
public static class TranslationAttachProperties { public static readonly AttachedProperty<ResourceManager> TranslationProperty = AvaloniaProperty.RegisterAttached<Control, ResourceManager>( "Translation", typeof(TranslationAttachProperties), inherits: true); // 必须开启继承 public static void SetTranslation(Control element, ResourceManager value) { element.SetValue(TranslationProperty, value); } public static ResourceManager GetTranslation(Control element) { return element.GetValue(TranslationProperty); } }
验证步骤
完成上述修改后,修改TranslationSourceWithMultipleResxFiles.Instance.CurrentCulture即可触发所有绑定的翻译文本自动更新,无需额外刷新界面。
内容的提问来源于stack exchange,提问作者K.Luth
相关产品推荐
相关产品推荐

