使用C#和XAML在Windows应用商店应用程序中绑定资源文件值字符串
我有资源文件:Strings\en US\Resources.resw 我正在尝试绑定到此文件中的字符串,如下所示:使用C#和XAML在Windows应用商店应用程序中绑定资源文件值字符串,c#,xaml,windows-8,windows-store-apps,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 P
<TextBlock Text="{Binding Path=LocalizedResources.app_name, Source={StaticResource LocalizedStrings}}" />
我猜这种方法是错误的,因为我得到“无法解析资源‘TestString’”
如何绑定到资源文件中的字符串
PS:我在资源文件中有TestString
PPS:我需要使用Studio 2012创建Windows 8应用商店应用程序,而不是Windows 8.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 ...
}
然后在相应的查看代码隐藏.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}
绑定您的值。我们正在创建视图模型类的一个实例,该实例将是当前页面的DataConext。绑定系统将查找相应的属性名称。如果找到它们,值将显示在UI上。如果不是,则不会发生错误,但在您期望值的地方,不会显示任何内容
您可以找到许多关于此模式的文档资源,只需搜索MVVM(Model View ViewModel)。您可以使用Windows Phone项目中的相同文件,但首先,您应该将本地化移到PCL-Portable类库。在本例中,您将以与Windows Phone相同的方式使用本地化。请,-这一点都不难。我已经创造了一种我自己的方法:
1) 在App.xaml中
2) 资源召集人
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) 装订
我看到的唯一缺点是必须将XAML中的DataContext属性设置为samething random。我本可以将字符串名称/键放入DataContext中,但这样我就无法将DataContext用于其真正用途。由于您已经有了一个使用资源文件的Windows Phone 8应用程序,因此很容易为您的Windows应用商店应用程序实现同样的功能。您只需在WinStore应用程序中复制WinPhone8应用程序中的结构即可
在WinStore应用程序中创建LocatedStrings类
将该类的内容从WinPhone复制并粘贴到WinStore
在应用程序中添加新的资源文件夹
添加名为AppResources的新资源文件。对于VS2012+Windows 8应用程序,您将找到Resource.resw文件。使用这种类型李>
单击解决方案资源管理器中的文件
打开属性窗口并将“PublicResXFileCodeGenerator”粘贴到自定义工具属性中(不带单引号)
在App.xaml中,在ResourceDictionary元素中添加以下内容(更改名称空间以匹配您自己的名称空间)
以与Windows Phone 8应用程序中相同的方式更改xaml中的文本值text=“{Binding Path=LocalizedResources.Test,Source={StaticResource LocalizedStrings}”
希望有帮助 如果您不管理或不知道如何制作绑定,请让我知道,我会告诉您,但我建议您自己搜索-您将通过这种方式学习得更好。到现在为止,一直都还不错。。。现在,我可以使用Resource.StringKey访问我的字符串。我还试图从WindowsPhone8应用程序复制相关代码,但失败了。那里的绑定看起来像这样Text=“{Binding Path=LocalizedResources.app_name,Source={StaticResource LocalizedStrings}}”您必须构建一个视图模型,并将值存储在一些公共属性中,这些属性随后将绑定到UI。我已经编写了一个WindowsPhone8应用程序,我希望我可以使用相同的资源文件进行本地化。我在那里的绑定看起来像这样:Text=“{Binding Path=LocalizedResources.app_name,Source={StaticResource LocalizedStrings}}”看看下面我的答案。是的,您可以使用相同的本地化,但您需要一些小代码。我使用的是Visual Studio Express,因此这不是一个选项。您可以使用或旁注的另一种方法:对于那些认为此解决方案有效但在Visual Studio Update 2之后现在无法使用的用户。。。VS.u2中存在一个错误,无法识别程序集中有“.”的可移植类库。