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

使用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

我有资源文件: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应用程序。

有一个工具-
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中存在一个错误,无法识别程序集中有“.”的可移植类库。