componmentResourceManager类的使用

2016-10-11  本文已影响123人  北风知我意

40.4.3  ComponentResourceManager对象

在本章的第一个例子中,打开本地化选项之后,代码使用一个ComponentResourceManager对象来检索与窗体相关的资源。ComponentResourceManager扩展了ResourceManager基类,提供了用于检索和应用组件属性的附加功能。第一个例子在设置Button1定义的属性时使用了下面4行代码:

Me.Button1.Location = New Point(71, 43)

Me.Button1.Size = New Size(185, 166)

Me.Button1.Text = "Button1"

Me.Button1.TabIndex = 0

使用ComponentResourceManager,代码可以压缩成一行:

resources.ApplyResources(Me.Button1, "Button1")

在Visual Studio的前一个版本中,打开本地化选项时将生成更加复杂的代码。每一个属性都会创建一个单独的ResourceManager调用,通过名称就可以检索属性,如下所示:

Me.Button1.Location = CType_

(resources.GetObject("Button1.Location"),Point)

Me.Button1.Size = CType(resources.GetObject("Button1.Size"), Size)

Me.Button1.TabIndex = CType(resources.GetObject

("Button1.TabIndex"),Integer)

Me.Button1.Text = resources.GetString("Button1.Text")

由于ComponentResourceManager也提供了GetObject方法,因此仍然可以使用上面的代码。问题在于,每一个需要本地化的属性都必须在编译时已知。在资源文件中添加每一个控件的每一个属性,这会给资源文件添加过多的属性(即使它们与默认值一样)。另外,在加载窗体时,它还会造成大量的资源浪费,因为每一个属性都是通过资源属性来设置的。

ComponentResourceManager类的ApplyResources方法的工作方式恰好相反。通过指定控件的名称(该名称必须在窗体上唯一),所有以该名称作为前缀的控件都会被抽取出来。然后就可以使用资源的全名来确定控件上要设置的属性。例如,可以为Button1控件抽取名为Button1.Location的资源,并使用相应的值来设置该控件上的Location属性。

该过程消除了在资源文件中指定每一个属性的必要性。它还允许使用文化资源文件指定那些没有在默认资源文件中定义的附加属性。

使用ComponentResourceManager会带来一些副作用。为了使用属性名称来设置控件上的属性,ComponentResouceManager使用"反射"(reflection)来寻找合适的属性。属性在获取以后才会被调用。为了设置属性而进行的每一个搜索,其开销都很大。然而,考虑到需要设置的属性数量已减少,这种开销是值得的,因为应用程序很容易实现本地化,而不需要重新编译主应用程序。

 

上一篇下一篇

猜你喜欢

热点阅读