【发布时间】:2020-03-03 21:27:49
【问题描述】:
我正在尝试实现一个简单的“按下按钮以更改应用程序语言和所有相关字符串”的示例。 (你可以在this GitHub repository看到整个代码)
在这个例子中,我有三个TextBlock 和一个绑定到我的语言资源的按钮:
还有:
<StackPanel
HorizontalAlignment="Center"
VerticalAlignment="Center"
Orientation="Vertical">
<TextBlock
HorizontalAlignment="Center"
FontSize="20"
Text="{Binding Source={StaticResource Localized}, Path=[A]}" />
<TextBlock
HorizontalAlignment="Center"
FontSize="20"
Text="{Binding Source={StaticResource Localized}, Path=[B]}" />
<TextBlock
HorizontalAlignment="Center"
FontSize="20"
Text="{Binding Source={StaticResource Localized}, Path=[C]}" />
<Button
x:Name="btnChangeLanguage"
Margin="10"
Padding="10"
Click="btnChangeLanguage_Click"
Content="{Binding Source={StaticResource Localized}, Path=[Change]}" />
</StackPanel>
如你所见,我表达了TextBlock(s) 的绑定:Text="{Binding Source={StaticResource Localized}, Path=[A]}"
类型为LocalizedStrings的本地化,是App类的静态属性:
public class LocalizedStrings : INotifyPropertyChanged
{
private readonly ResourceLoader _resources;
private readonly LocalizationHelper _localizationHelper;
public event PropertyChangedEventHandler PropertyChanged;
public LocalizedStrings()
{
_resources = ResourceLoader.GetForViewIndependentUse();
_localizationHelper = App.LocalizationHelper;
_localizationHelper.OnLocalizationChange += _localizationHelper_OnLocalizationChange;
}
public string this[string key]
{
get
{
return _resources.GetString(key);
}
}
private void _localizationHelper_OnLocalizationChange(object sender, System.EventArgs e)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(string.Empty));
}
}
LocalizationHelper 最有趣的部分只是:
public void ChangeLocalizationTo(string cultureCode)
{
Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = cultureCode;
OnLocalizationChange?.Invoke(null, new PropertyChangedEventArgs(string.Empty));
}
最后是MainPage按钮的代码:
private void btnChangeLanguage_Click(object sender, RoutedEventArgs e)
{
if (LocalizationHelper.IsCultureItalian(App.LocalizationHelper.GetCurrentLocalizationCode()))
App.LocalizationHelper.ChangeLocalizationTo("en-US");
else App.LocalizationHelper.ChangeLocalizationTo("it-IT");
}
绑定工作正常,但它们绑定只是第一次并且永远不会更新。因此,我启动应用程序时看到了字符串(也在设计时),但是当我按下按钮时没有任何反应。似乎OnLocalizationChange?.Invoke(null, new PropertyChangedEventArgs(string.Empty));(被调用)不允许应用程序调用属性来获取翻译。 (注意我用string.Empty作为属性名来通知这个类的所有属性都被改变了)
“有趣”的事实是,使用 WPF 制作的相同示例可以完美运行!
这让我觉得两个平台的绑定逻辑有一些不同的行为。
我已经尝试过绑定Mode=OneWay,但它不起作用。
(你可以在this GitHub repository看到整个代码)
【问题讨论】:
标签: c# data-binding uwp localization xamarin.uwp