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

众所周知,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"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值