1

好的,所以这个原型的总体目标是使用 C# 中的 WPF 创建一个 GUI 窗口,允许用户从菜单更改语言。目前,我正在尝试使用 App.config 文件将窗口的某些组件从英语切换为德语。我知道这不会允许使用按钮更改资产,但这是一个开始。

我有 3 个资源文件。一个是默认的(英语),另一个也是英语,标记为 en-US,最后一个是德语,标记为 de-DE。他们都是公开的。

我使用这两个视频作为指导方针:

http://www.youtube.com/watch?v=5MuN6VOw9r4

http://www.youtube.com/watch?v=BK7jp3snwCQ

我在该部分设置了一个标签和两个按钮的XAML内容:

<Label Content="{x:Static properties:Resources.Label1}" Height="28" Margin="6,6,79,0" Name="Label1" VerticalAlignment="Top"></Label>
<Button Content="{x:Static properties:Resources.Button1}" Height="23" HorizontalAlignment="Left" Margin="6,40,0,0" Name="Button1" VerticalAlignment="Top" Width="75"></Button>
<Button Content="{x:Static properties:Resources.Button2}" Height="23" HorizontalAlignment="Left" Margin="6,69,0,0" Name="Button2" VerticalAlignment="Top" Width="75"></Button>

这就是我在 App.config 文件(de-DE)中的内容,应该将编辑的内容更改为德语:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="Culture" value="de-DE" />
  </appSettings>
</configuration>

最后,我的 xaml.cs 文件包含以下内容:

using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.Globalization;
using System.Configuration;

namespace WPF_Prototype1
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            /// This line should allow the program to read the App.config file!
            Properties.Resources.Culture = new CultureInfo(ConfigurationManager.AppSettings["Culture"]);
        }
    }
}

为什么我的程序仍然没有将这些图标更改为德语?我能做些什么来修复它?

谢谢

4

2 回答 2

1

我解决问题的第一件事是创建一个新项目。在新项目下,我创建了相同的 3 个资源文件并将它们添加到项目属性中。之后,我创建了相同的 App.config 文件。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="Culture" value="de-DE" />
  </appSettings>
</configuration>

我还在 xaml.cs 文件中留下了相同的代码:

Properties.Resources.Culture = new CultureInfo(ConfigurationManager.AppSettings["Culture"]);

在确保我的资源文件中的所有名称都匹配后,我在 xaml 设计窗口中编写了以下代码:

<Label Content="{x:Static properties:Resources.LabelFirstName}" Height="28" HorizontalAlignment="Left" Margin="33,29,0,0" Name="labelFName" VerticalAlignment="Top" />
        <Label Content="{x:Static properties:Resources.LabelLastName}"  Height="28" HorizontalAlignment="Left" Margin="34,65,0,0" Name="labelLName" VerticalAlignment="Top" />
        <Label Content="{x:Static properties:Resources.LabelAddress}"   Height="28" HorizontalAlignment="Left" Margin="35,103,0,0" Name="labelAddress" VerticalAlignment="Top" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="119,26,0,0" Name="textBoxFName" VerticalAlignment="Top" Width="152" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="119,63,0,0" Name="textBoxLName" VerticalAlignment="Top" Width="152" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="119,100,0,0" Name="textBoxAddress" VerticalAlignment="Top" Width="152" />
        <Button Content="{x:Static properties:Resources.EnglishButton}" Height="23" HorizontalAlignment="Left" Margin="177,155,0,0" Name="englishButton" VerticalAlignment="Top" Width="94" />
        <Button Content="{x:Static properties:Resources.GermanButton}" Height="23" HorizontalAlignment="Left" Margin="177,207,0,0" Name="germanButton" VerticalAlignment="Top" Width="94" />

我认为不同之处在于资源文件中的资产名称与 xaml 设计窗口中的名称不同。例如,我的第一个标签在资源文件中被称为“LabelFirstName”,但它labelFName在 xaml 窗口中被调用。我也没有拖放任何组件。我确保它们是书面格式的。

于 2013-07-03T19:42:20.480 回答
0

我做了类似的事情,我可以确认工作,并且在运行时也发生了变化。回顾一下您可能需要让 INotifyPropertyChanged 参与其中的代码。

首先,我在文化的 ViewModel 上有属性,它还通知所有文本的更改

public CultureInfo CurrentUICulture
{
  get { return Properties.Resources.Culture; }
  set
  {
    Properties.Resources.Culture = value;

    OnPropertyChanged("Title");
    OnPropertyChanged("Description");
    OnPropertyChanged("FarenheitLabel");
    OnPropertyChanged("CelsiusLabel");
    OnPropertyChanged("Language");
  }
}

并且属性暴露为(注意评论)

// We could have bound the UI directly to Properties.Resources then we wouldn't be able to 
// NotifyPropertyChanged when the culture changes 
public string Title { get { return Properties.Resources.Title; } }
public string Description { get { return Properties.Resources.Description; } }
public string FarenheitLabel { get { return Properties.Resources.FarenheitLabel; } }
public string CelsiusLabel { get { return Properties.Resources.CelsiusLabel; } }
public string Language { get { return Properties.Resources.Language; } }

然后我直接从 ViewModel 中提取它

<Label Grid.Row="5" Grid.ColumnSpan="2"
            Content="{Binding Language, FallbackValue=Language}"/>
于 2013-07-03T16:08:56.027 回答