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



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

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

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

我想这种方法是错误的,因为我得到"资源‘TestString’无法解析。"。

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


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

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

您可以使用Windows Phone项目中的相同文件,但首先,您应该将本地化移到PCL-Portable类库中。在这种情况下,您将以与Windows Phone相同的方式使用本地化。请阅读本教程,它一点也不难。

有一个工具-PublicResXFileCodeGenerator,您可以使用它来访问这种情况下的资源文件值:

MyResourceFile.ResourceString;

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

绑定方法的编辑

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

假设您的资源文件中有三行值:FirstName、LastNameAge。所以你会访问它们,比如:

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

然后在.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}绑定您的值。我们正在创建ViewModel类的一个实例,该实例将是当前页面的DataConext。绑定系统将查找相应的属性名称。如果找到了这些值,则会在UI上显示这些值。如果不是,则不会出现错误,但在您期望值的位置,则不会显示任何内容。

您可以找到许多关于此模式的文档资源,只需搜索MVVM(模型视图视图模型)即可。

我创建了一个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属性设置为相同的随机属性。我本可以把字符串name/key放在DataContext中,但这样我就无法将DataContext用于其真正的目的。

由于您已经有一个使用资源文件的Windows Phone 8应用程序,因此很容易为您的Windows应用商店应用程序提供相同的功能。你所需要做的就是在你的WinStore应用程序中复制你在WinPhone8应用程序中的结构。

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

希望能有所帮助!

最新更新