我喜欢更改按钮,标签等中使用的语言..当您从按钮中选择语言时(或其他内容,但现在只需按一下按钮)。 但唯一改变的是带有selectedLanguage的Label,但我也想要用正确的语言改变另一个Label的内容。我需要做些什么来刷新它显示正确语言(文化)的观点?
我的XAML代码快照:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="45"/>
<RowDefinition Height="45"/>
<RowDefinition Height="45"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Label Content="{x:Static res:Strings.ProjectName}" Grid.Column="0" Grid.Row="1" />
<Label Content="{Binding SelectedLanguage}" Grid.Column="1" Grid.Row="1" />
<Button Name="btnNL" Content="{x:Static res:Strings.BtnPushMe}" Command="{Binding PushMe, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" CommandParameter="NL" Width="100" Height="45" Grid.Column="1" Grid.Row="0"/>
<Button Name="btnEN" Content="{x:Static res:Strings.BtnPushMe}" Command="{Binding PushMe, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" CommandParameter="EN" Width="100" Height="45" Grid.Column="2" Grid.Row="0"/>
</Grid>
我的ViewModel具有以下代码:
public class MainWindowViewModel : NotifyPropertyChanged
{
private ICommand m_pushMeCommand;
private SynchronizationContext syncCtx;
public MainWindowViewModel()
{
syncCtx = SynchronizationContext.Current;
if (Language == null)
{
Language = new ObservableCollection<string>();
}
Language.Clear();
Language.Add("NL");
}
public ObservableCollection<string> Language { get; set; }
public string SelectedLanguage
{
get { return Language[0].ToString(); }
}
public ICommand PushMe
{
get
{
if (m_pushMeCommand == null)
{
m_pushMeCommand = new RelayCommand(
(g) => ChangeLanguage(g)
);
}
SendPropertyChanged("ChangeLanguage");
return m_pushMeCommand;
}
}
private void ChangeLanguage(object param)
{
var language = param as string;
CultureInfo culture = null;
if (Language == null)
{
Language = new ObservableCollection<string>();
}
Language.Clear();
switch (language)
{
case "NL":
Language.Add("NL");
culture = new CultureInfo("nl-NL");
break;
case "EN":
Language.Add("ENG");
culture = new CultureInfo("en-EN");
break;
default:
break;
}
if (culture != null)
{
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
}
SendPropertyChanged("SelectedLanguage");
}
}
答案 0 :(得分:1)
XAML处理器会将Content
的{{1}}和Label
设置为您在标记中定义的静态值,然后这些值将不会发生变化。< / p>
如果您希望能够动态更改文化并在运行时期间相应地更新UI元素,则应阅读以下CodeProject文章:
使用RESX文件进行WPF本地化: https://www.codeproject.com/Articles/35159/WPF-Localization-Using-RESX-Files
它使用名为Buttons
的自定义标记扩展来完成工作:
Resx
内置的<TextBlock Text="{Resx ResxName=MyApp.TestWindow, Key=MyText}"/>
类不支持自动检测文化更改,我担心您需要自定义解决方案。
答案 1 :(得分:1)
为什么不创建一个简单的代码行来执行以下操作:
private void refreshContent(string content)
{
foreach(custom_control.button button in grid) //add gridname
{
button.content = content;
}
}
现在我明白你正在寻找一种更微妙的方法,但我认为这样做会很好,除非屏幕上有超过50个按钮。
编辑:看看mm8的答案。