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

时间:2014-01-15 08:53:16

标签: c# xaml windows-8 windows-store-apps

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

我正试图从这个文件中绑定一个字符串,如下所示:

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

我想这种方法是错误的,因为我得到“资源'TestString'无法解决。”

如何从资源文件绑定到字符串?


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

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

4 个答案:

答案 0 :(得分:1)

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

MyResourceFile.ResourceString;

您可以将该值存储到属性中,然后在UI上将其绑定。

编辑绑定方法

您需要一个ViewModel,它将在该视图中设置为DataContext

假设您的资源文件中有三行包含值: FirstName,LastName Age 。因此,您将访问它们:

string firstName = MyResourceFile.FirstName;
string lastName = MyResourceFile.LastName;
int age = Convert.ToInt32(MyResourceFile.Age); //made it an int

您必须创建一个将作为ViewModel的类。

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 ...
}

然后在相应的View代码隐藏.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;

4)将它们绑定在你的XAML中:

<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(模型 - 视图 - 视图模型)

答案 1 :(得分:1)

您可以使用Windows Phone项目中的相同文件,但首先,您应该将本地化移动到PCL - 可移植类库。在这种情况下,您将以与Windows Phone中相同的方式使用本地化。请read this tutorial - 这一点都不难。

答案 2 :(得分:0)

我hava创造了一种myown的方法:

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实现其目的。

答案 3 :(得分:0)

由于您已经拥有一个使用资源文件的Windows Phone 8应用程序,因此可以轻松地为您的Windows应用商店应用程序工作。您需要做的就是复制WinPhone应用程序中WinStore应用程序中的结构。

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