WinRT:将RESX的Designer.cs改造给RESW资源文件使用

来源:互联网 发布:淘宝信誉度等级表 编辑:程序博客网 时间:2024/06/06 04:38

众所周知,Windows 8 WinRT开发中Visual Studio工程模板中的RESW资源文件没有像RESX资源文件那样,具有自动生成的属性定义。而RESX资源文件的属性定义是通过其背后的xxx.Designer.cs文件,我们要实现的就是把RESX资源文件的Designer.cs改造给RESW资源文件使用,这样RESW资源文件的字符串也可以通过一个静态类型来直接访问了。

 

步骤一就是定义RESX资源文件,在任何非WinRT工程中都是可以定义RESX资源文件的。定义好了RESX资源文件后,全选RESX资源文件编辑中的内容,复制,并粘贴到WinRT的RESW资源文件编辑窗口中,这样RESW资源文件就有了和RESX一样的数据内容。

image

步骤二是在全选RESX资源文件后的xxx.Designer.cs类型的内容,并粘贴到WinRT工程中。

接下来开始对RESX资源文件的Designer.cs进行改造,因为它是无法直接通过WinRT工程的编译的。

 

RESX资源文件的Designer.cs其实是通过初始化一个ResourceManager类型,然后通过GetString方法来定义所有属性,而在WinRT中,推荐使用的类型是ResourceLoader,但是ResourceManager类型本身仍然存在,可以继续使用,但是需要做一些修正才能通过编译,找到Designer.cs中的ResourceManager属性,它的定义类似这样:

internal static global::System.Resources.ResourceManager ResourceManager

{

    get

    {

        if (object.ReferenceEquals(resourceMan, null))

        {

            global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Mgen.WpfApp.Resource", typeof(Resource).Assembly);

            resourceMan = temp;

        }

        return resourceMan;

    }

}

 

其中这句:

new global::System.Resources.ResourceManager("Mgen.WpfApp.Resource", typeof(Resource).Assembly);

 

把第一个参数改为RESW的文件名称,不需要加上命名空间,比如Resources.resw就改成Resources。

第二个参数无法通过编译的,因为在WinRT中Type类型没有Assembly属性,我们需要System.Reflection命名空间内的扩展方法来获取类型的TypeInfo,然后再获取它的Assembly对象。因此需要在最上方命名空间引用上加入:

using System.Reflection;

 

所以这句代码最终改成:

new global::System.Resources.ResourceManager("Resources", typeof(Resource).GetTypeInfo().Assembly);

 

关于GetTypeInfo,可以参考另一篇文章:.NET 4.5(C#):TypeInfo类型和反射中的成员枚举。

关于ResourceManager和RESX文件,可以参考:.NET(C#):浅谈程序集清单资源和RESX资源。

 

最后就可以通过静态类型来访问RESW的资源数据了,类似这样:

async private void Button_Click_1(object sender, RoutedEventArgs e)

{

    await new Windows.UI.Popups.MessageDialog(Resource.a).ShowAsync();

}

 

当然如果RESW资源变化后,读者必须重新再复制RESW资源内容到RESX编辑器中,然后再把RESX的Designer.cs内容更新到修改后的RESW的Designer.cs中。


<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>