最近对写WOW的插件比较有兴趣,而且准备抛弃大脚,可能有个原因就是因为它对代码进行了扰乱工作,个人不是很喜欢这种行为。如果你真不喜欢别人看你代码,那么你不公布就可以了。看看老外的插件,有几个不是不仅没有扰乱而且还写好注释、版本信息什么的。不就会写两个臭代码吗?有什么好藏的,又没几个人看得懂,而且我看很多插件也是用的别人的。哦,废话少说,切入正题!
对WOW的UI有兴趣的人应该都知道xml定义的是界面元素,它本身自带的xml定义都放在Interface/FrameXML下(不谈及登录画面),插件则在Interface/Addons下面。在xml中可以定义被称作模板(template)的一个东西,这样的定义并不实际生成界面对象。我曾经想要在插件中为UI本身的一个模板中添加一个界面元素时,却是行不通的。我认为这可能是WOW首先载入所有Interface/FrameXML中的界面元素,并实际生成对象,若有继承自某一模板的话则同样生成该模板的东西,之后在addons下无论你怎样往本身的Template(将Template作为父元素)中添加都是无效的,或许是定义一个模板,它必须是最基础的框架元素(LayoutFrame)但可以继承自某一模板(是不是也可以不是模板呢?我想应该是可以的),而你不能做的是为某一模板在再添加元素(这点没测试过)。这里我的这种写法
到底是语法错误(不支持这种形式,parent必须是一个可以存在/生成的对象)还是在读入Interface之后生成界面对象了,更改Template已经无效了(因为它们根据最原始的template已经生成了),不过在Addons中你可以通过为已经存在的对象添加元素,因为它是实际的马上可以附加上去的,而不是更改原始模板。
这样看来,似乎wow在读完interface后就生成了所有界面元素的对象,而addons的界面定义只是再生成一次插件自己的对象并附于某一个界面元素上,比如经常用到的UIParent对象。这样似乎看上去解释很完美了!
但在那天不断的想实现往UI本身已经写好的模板中添加一个FontString的时候曾经作出这样一个尝试。
这里ObjectName是一个最终在界面中会存在的对象的名字,我想这样应该是没问题了,但结果告诉我是不行。最终在这个ObjectName是根据它父对象的名字生成出来的一个名字的情况下,即使我已经写好了它最终会生成的名字,它还是不会被建立(但假如你写PlayerFrame这是可以的),那么这应该是代表了在插件被载入时界面元素都还没形成对象才对。但这不和我前面的推测刚好相反吗?这就是我的疑问所在。
不过在写这个文章时我似乎已经找到了答案,那就是:不能为模板再添加元素,你只能重写一个新的模板并继承自某一模板(不是模板是否可行?不过与这里说的无关)。如果这时真的,那么我的问题应该就已经得到一个圆满的答案了。
既然写此文时找到一个答案,那么现在去测试下,稍后回来公布正确与否!