使用C#和XAML在Windows Store应用程序中绑定资源文件值字符串

3

我有一个资源文件:Strings\en-US\Resources.resw

我尝试像这样绑定到该文件中的字符串:

<TextBlock Text="{Binding Path=LocalizedResources.app_name, Source={StaticResource LocalizedStrings}}" />

我认为这种方法是错误的,因为我得到了 "The Resource 'TestString' could not be resolved." 的错误信息。

我该如何绑定到资源文件中的字符串?


PS:我在资源文件中有TestString。

PPS:我需要使用Studio 2012创建Windows 8商店应用程序,而不是Windows 8.1应用程序。


我已经编写了一个Windows Phone 8应用程序,希望可以使用相同的资源文件进行本地化。我的绑定看起来像这样:Text="{Binding Path=LocalizedResources.app_name, Source={StaticResource LocalizedStrings}}" - Mit_
看看我下面的答案。是的,你可以使用相同的本地化,但你需要一些小代码片段。 - crea7or
4个回答

1

有一个工具 - PublicResXFileCodeGenerator,可以用来访问资源文件的值:

MyResourceFile.ResourceString;

你可以将该值存储到属性中,然后在 UI 上进行绑定。
为了使用绑定方法,您需要一个 ViewModel,并将其设置为 View 的 DataContext。
假设您的资源文件中有三行值:FirstName、LastName 和 Age。那么您将像这样访问它们:
string firstName = MyResourceFile.FirstName;
string lastName = MyResourceFile.LastName;
int age = Convert.ToInt32(MyResourceFile.Age); //made it an int

你需要创建一个类,作为你的视图模型。

public class MyViewModelClass : INotifyPropertyChanged 
{
    private string firstName;
    public string FirstName
    {
        get { return firstName; }
        set { firstName = value; OnPropertyChanged(); }
    }

    private string lastName;
    public string LastName
    {
        get { return lastName; }
        set { lastName = value; OnPropertyChanged(); }
    }

    private string age;
    public string Age
    {
        get { return age; }
        set { age= value; OnPropertyChanged(); }
    }

    //Also the INotifyProperty members ...
}

然后在相应的视图代码后台.cs文件中:

1)定义并声明MyViewModelClass的实例。

public MyViewModelClass viewModel = new MyViewModelClass();

2) 将DataContext设置为先前设置的实例。

this.DataContext = this.viewModel;

3)从资源文件中添加您的值:

this.viewModel.FirstName = MyResourceFile.FirstName;
this.viewModel.LastName = MyResourceFile.LastName;
this.viewModel.Age = MyResourceFile.Age;

将它们绑定在你的XAML中:

4)

<TextBlock Text="{Binding FirstName}" /> 
<TextBlock Text="{Binding LastName}" />
<TextBlock Text="{Binding Age}" />
//The names of the public properties in the View Model class
我很困惑!这些东西都是什么意思?

如果您使用INotifyPropertyChanged,当绑定值发生更改时,您将能够自动更新UI。这是因为在每个属性的setter中,都有OnPropertyChange();调用,它将通知您的UI值已更改。 OnPropertyChange()调用应始终在值更改后之后进行,否则,更改将无法反映在UI上。

每个页面都有一个DataContext(不仅仅是页面,许多元素也有)。从中,您可以在XAML中使用{Binding something}绑定您的值。我们正在创建View Model类的实例,该实例将是当前页面的DataConext。绑定系统将寻找相应的属性名称。如果找到了值,则会显示在UI上。如果没有找到,则不会出现错误,但在您期望值的位置,将不会显示任何内容。

您可以找到很多关于此模式的文档资源,只需搜索MVVM(Model-View-ViewModel)即可。


如果你不会或者不知道如何进行绑定,请告诉我,我会告诉你的,但是我建议你自己去搜索 - 这样你会更好地学习。 - VasileF
到目前为止一切都很好……现在我可以使用Resource.StringKey访问我的字符串了。我还尝试从Windows Phone 8应用程序中复制相关代码,但失败了。那里的绑定看起来像这样Text="{Binding Path=LocalizedResources.app_name, Source={StaticResource LocalizedStrings}}" - Mit_
你需要构建一个视图模型,并将值存储在一些公共属性中,然后将其绑定到用户界面上。做出了修改。 - VasileF

1

您可以使用来自Windows Phone项目的相同文件,但首先,您应该将本地化移动到PCL - Portable Class Library。在这种情况下,您将以与Windows Phone相同的方式使用本地化。请阅读此教程 - 这并不难。


我正在使用Visual Studio Express,所以这不是一个选项。 - Mit_
你可以使用多语言应用工具包ResX代码生成器来实现另一种方式。 - crea7or
附注:对于那些发现这个解决方案有效但在 Visual Studio Update 2 后不再有效的人...这是 VS.u2 中的一个错误,它无法识别程序集中带有“.”的可移植类库。 - Dave Friedel

0
我创建了自己的一个方法:
1)在App.xaml中 <localUtils:ResourceStringConventer x:Key="LocalizedStringsConventer" ></localUtils:ResourceStringConventer> 2)ResourceStringConventer
public class ResourceStringConventer : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {     
        ResourceLoader resourceLoader = new ResourceLoader();
        string text = resourceLoader.GetString((string)parameter);
        return text;
    }
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

3) 绑定

<TextBlock Text="{Binding Converter={StaticResource LocalizedStringsConventer}, ConverterParameter='TestString'}" DataContext="dgsdf" />

唯一的缺点是您必须在XAML中设置DataContext属性为任意值。我本可以将字符串名称/键放入DataContext中,但这样我将无法使用DataContext的实际用途。


0

由于您已经拥有一个使用资源文件的Windows Phone 8应用程序,因此将同样的功能应用于Windows Store应用程序将变得非常容易。您需要做的就是在WinStore应用程序中复制您在WinPhone8应用程序中拥有的结构。

  1. 在WinStore应用程序中创建一个LocatedStrings类
  2. 从WinPhone复制并粘贴该类的内容到WinStore
  3. 在您的应用程序中添加一个新的Resources文件夹
  4. 添加一个名为AppResources的新资源文件。对于VS2012+Windows 8应用程序,您将找到一个Resource.resw文件。请使用此类型。
  5. 单击解决方案资源管理器中的文件。
  6. 打开属性窗口,并将“PublicResXFileCodeGenerator”粘贴到自定义工具属性中(不包括单引号)
  7. 在App.xaml中,在ResourceDictionary元素中添加以下内容(更改命名空间以匹配您自己的)
  8. 以与Windows Phone 8应用程序相同的方式更改xaml中的文本值Text="{Binding Path=LocalizedResources.Test, Source={StaticResource LocalizedStrings}}"

希望这可以帮助您!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接