按下按钮后如何更改文化?

时间:2018-01-15 14:24:28

标签: c# wpf mvvm resources

我喜欢更改按钮,标签等中使用的语言..当您从按钮中选择语言时(或其他内容,但现在只需按一下按钮)。 但唯一改变的是带有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");
    }
}

2 个答案:

答案 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的答案。