Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF语言资源选择组合框不能正常工作_C#_Wpf_Xaml_Combobox - Fatal编程技术网

C# WPF语言资源选择组合框不能正常工作

C# WPF语言资源选择组合框不能正常工作,c#,wpf,xaml,combobox,C#,Wpf,Xaml,Combobox,我在一个WPF C#应用程序中工作,它有一个带有两种语言选择的组合框。我在网上找到了一个教程,在更改语言资源方面完全符合我的要求,但问题是,我有几个WPF窗口,所有这些窗口都有一个按钮链接,指向在启动应用程序时启动的主窗口,其中组合框可用。首次启动时,语言选择工作正常,默认为英语,但是,当您使用不同语言从主窗口导航到另一个窗口时,会出现问题。当单击“主页”按钮时,所选语言始终为英语,尽管我已将其更改为其他语言,如果我需要更改回英语,则需要单击其他语言,然后单击“返回英语”以还原为英语英语: 如何

我在一个WPF C#应用程序中工作,它有一个带有两种语言选择的组合框。我在网上找到了一个教程,在更改语言资源方面完全符合我的要求,但问题是,我有几个WPF窗口,所有这些窗口都有一个按钮链接,指向在启动应用程序时启动的主窗口,其中组合框可用。首次启动时,语言选择工作正常,默认为英语,但是,当您使用不同语言从主窗口导航到另一个窗口时,会出现问题。当单击“主页”按钮时,所选语言始终为英语,尽管我已将其更改为其他语言,如果我需要更改回英语,则需要单击其他语言,然后单击“返回英语”以还原为英语英语: 如何使应用程序自动检测当前资源字典并更改组合框以反映所选语言? 下面是一些代码:

private void ddlLanguage_SelectionChanged(object sender, SelectionChangedEventArgs e)  
{  
    var currentResourceDictionary = (
        from d in BaseModel.Instance.ImportCatalog.ResourceDictionaryList  
        where d.Metadata.ContainsKey("Culture") && d.Metadata["Culture"].ToString().Equals(vm.SelectedLanguage.Code)  
        select d).FirstOrDefault();

    if (currentResourceDictionary != null)  
    {  
        var previousResourceDictionary = (
            from d in BaseModel.Instance.ImportCatalog.ResourceDictionaryList  
            where d.Metadata.ContainsKey("Culture") && d.Metadata["Culture"].ToString().Equals(vm.PreviousLanguage.Code)  
            select d).FirstOrDefault();

        if (previousResourceDictionary != null && previousResourceDictionary != currentResourceDictionary)
        {
            Application.Current.Resources.MergedDictionaries.Remove(previousResourceDictionary.Value);
            Application.Current.Resources.MergedDictionaries.Add(currentResourceDictionary.Value);

            CultureInfo cultureInfo = new CultureInfo(vm.SelectedLanguage.Code);

            Thread.CurrentThread.CurrentCulture = cultureInfo;
            Thread.CurrentThread.CurrentUICulture = cultureInfo;

            Application.Current.MainWindow.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag);

            vm.PreviousLanguage = vm.SelectedLanguage;
        }
    }
}  
在ViewModel构造函数中:

public MainViewModel()
{
    LoadResources();
    SelectedLanguage = LanguageList.FirstOrDefault();
    PreviousLanguage = SelectedLanguage;
}

private void LoadResources()
{
    LanguageList = new List<Languages>();
    LanguageList.Add(new Languages() { Code = "en-GB", Name = "English" });
    LanguageList.Add(new Languages() { Code = "cy-GB", Name = "Cymraeg" });
}
在组合框的主窗口xaml中:

<ComboBox x:Name="ddlLanguage" 
          FontSize="22"
          DisplayMemberPath="Name"
          ItemsSource="{Binding LanguageList}"
          SelectedValue="{Binding SelectedLanguage, Mode=TwoWay}"
          SelectionChanged="ddlLanguage_SelectionChanged"
          Margin="178,61,940,148" />

首先尝试在设置或数据库中保存所选语言 并在应用程序启动时使用保存的选定语言更改语言,并放一条说明:必须重新启动应用程序才能应用更改 . 并检查在绑定中是否使用了DynamicSource

 <TextBlock Text="{DynamicResource myText}"/>

我发现解决我的问题时可能会出现一些不寻常的情况:我已从ViewModel main方法中启动了语言列表,并删除了组合框的启动,这使我的列表中留下了一个空白条目:

public TestViewModel()
{
    language = new List<Languages>
    {
        new Languages { Name="English", Code="en-GB" },
        new Languages { Name="Welsh", Code="cy-GB" },
    };
    //SelectedLanguage = language.FirstOrDefault();
    //PreviousLanguage = selectedLanguage;
}
这样,当应用程序首次加载组合框时,不显示任何条目,但您将能够选择所选的语言;当单击返回到应用程序主页时,相同的过程开始,这样用户就不会对当前显示的语言和组合框的所选值感到困惑,而组合框的所选值总是指
FirstOrDefault()
value。 我设法使用名为
ItemSource
的组合框属性,它是基于索引的,然后使用switch语句应用我的逻辑


如果您看到我可以应用的任何修改,请随时发表意见。

问题是,当我导航到其他页面并选择其他语言时,视图模型将始终将所选语言设置为英语,但当单击“hone”按钮时,仍显示其他语言,但所选项目以组合显示英语
public TestViewModel()
{
    language = new List<Languages>
    {
        new Languages { Name="English", Code="en-GB" },
        new Languages { Name="Welsh", Code="cy-GB" },
    };
    //SelectedLanguage = language.FirstOrDefault();
    //PreviousLanguage = selectedLanguage;
}
private void ddlLanguage_SelectionChanged(object sender, RoutedEventArgs e)
{
    #region Method body
    var indx = ddlLanguage.ItemsSource;
    string previousLang = "";

    foreach (var item in indx)
    {
        switch (ddlLanguage.SelectedIndex)
        {
            case 0:
                ddlLanguage.SelectedItem = "English";
                vm.SelectedLanguage.Code = "en-GB";
                previousLang = "cy-GB";

                var currentResourceDictionary = (
                    from d in BaseModel.Instance.ImportCatalog.ResourceDictionaryList
                    where d.Metadata.ContainsKey("Culture") && d.Metadata["Culture"].ToString().Equals(vm.SelectedLanguage.Code)
                    select d).SingleOrDefault();

                if (currentResourceDictionary != null)
                {
                    var previousResourceDictionaryE = (
                        from d in BaseModel.Instance.ImportCatalog.ResourceDictionaryList
                        where d.Metadata.ContainsKey("Culture") && d.Metadata["Culture"].ToString().Equals(previousLang)
                        select d).SingleOrDefault();

                    if (previousResourceDictionaryE != null && previousResourceDictionaryE != currentResourceDictionary)
                    {
                        Application.Current.Resources.MergedDictionaries.Add(currentResourceDictionary.Value);
                        CultureInfo cultureInfo = new CultureInfo(vm.SelectedLanguage.Code);
                        Thread.CurrentThread.CurrentCulture = cultureInfo;
                        Thread.CurrentThread.CurrentUICulture = cultureInfo;
                        Application.Current.MainWindow.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag);
                        previousLang = vm.SelectedLanguage.Code;
                    }
                }
                break;

            case 1:
                ddlLanguage.SelectedItem = "Welsh";

                vm.SelectedLanguage.Code = "cy-GB";
                previousLang = "en-GB";
                var currentResourceDictionaryE = (
                    from d in BaseModel.Instance.ImportCatalog.ResourceDictionaryList
                    where d.Metadata.ContainsKey("Culture") && d.Metadata["Culture"].ToString().Equals(vm.SelectedLanguage.Code)
                    select d).SingleOrDefault();
                if (currentResourceDictionaryE != null)
                {
                    if (currentResourceDictionaryE != null)
                    {
                        var previousResourceDictionaryE = (
                            from d in BaseModel.Instance.ImportCatalog.ResourceDictionaryList
                            where d.Metadata.ContainsKey("Culture") && d.Metadata["Culture"].ToString().Equals(previousLang)
                            select d).SingleOrDefault();

                        if (previousResourceDictionaryE != null && previousResourceDictionaryE != currentResourceDictionaryE)
                        {
                            Application.Current.Resources.MergedDictionaries.Add(currentResourceDictionaryE.Value);
                            CultureInfo cultureInfo = new CultureInfo(vm.SelectedLanguage.Code);
                            Thread.CurrentThread.CurrentCulture = cultureInfo;
                            Thread.CurrentThread.CurrentUICulture = cultureInfo;
                            Application.Current.MainWindow.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag);
                            previousLang = vm.SelectedLanguage.Code;
                        }
                    }
                }    
                break;
            }
        }

        #endregion Method body
    }
}