C# 使用XAML从DB获得WPF多语言支持
我正在尝试扩展我的WPF应用程序,以便从数据库获得多语言支持 我的方法将使用ResourceKey来识别每个控件的内容 创建此is MVVM只需更改属性以使用资源和所选语言查询数据库,如下所示:C# 使用XAML从DB获得WPF多语言支持,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我正在尝试扩展我的WPF应用程序,以便从数据库获得多语言支持 我的方法将使用ResourceKey来识别每个控件的内容 创建此is MVVM只需更改属性以使用资源和所选语言查询数据库,如下所示: public string Example { get { if (SelectedLanguage == null) return string.Empty; return
public string Example
{
get
{
if (SelectedLanguage == null)
return string.Empty;
return ControlMapping.getKey("MainWindow_TxtBoxExample", SelectedLanguage.LanguageID);
}
}
为了使绑定正常工作,我设置了一个转换器,它将获取密钥并从DB中选择适当的值
public class LanguageSupport : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return ControlMapping.getKey(value.ToString(), SelectedLanguage.LanguageID);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
然后在窗口中,我创建了一个静态资源来访问转换器
<Window.Resources>
<LangSupport:LanguageSupport x:Key="ls"/>
</Window.Resources>
不幸的是,如果我被卡住了
我猜转换器不是填充各种控件内容的正确方法
非常感谢您提供的任何帮助。我提供了对mscorlib的引用,以访问String类
xmlns:sys="clr-namespace:System;assembly=mscorlib"
然后我定义了一个可以用来分配给控件的资源
<Window.Resources>
<LangSupport:LanguageSupport x:Key="ls"/>
<sys:String x:Key="hardccodedstring">MainWindow.hardcodedstring</sys:String>
</Window.Resources>
你必须为你拥有的每个绑定指定你的转换器,这不是自动完成的。我意识到这一点,但这是难以捉摸的部分。当我开始的时候,我编写了代码,但是这不起作用。根据Window.Resources,您需要通过更改绑定,其中ls是您的转换器密钥。但是,如果您在许多窗口中使用它,我建议将它放在您的App.Resources(在App.xaml上)中,恐怕这不起作用。内容为空,转换器上的断点未被命中。应用程序资源通常是我的方法,但由于项目限制,它不是一个选项。使用转换器是一种非常笨拙的方法。ResourceManager只是一个在资源文件中查找内容的静态类——您可以创建自己的ResourceManager,从数据库中检索。
<Label Name="ex3" Content="{Binding Converter={StaticResource ls}, ConverterParameter={StaticResource hardccodedstring}}"/>
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (parameter == null)
return string.Empty;
return ControlMapping.getKey(parameter.ToString(), SelectedLanguage.LanguageID);
}