XLUE164版本的模板新增了两个关于模板实例化的事件:
Ret, handled,callNext OnPreCreateInstance(template, userdata)
该事件在模板被实例化之前触发,假如此时需要动态修改模板,那么可以响应这个事件,然后利用模板对象(template参数)来修改并保存,
那么接下来的实例化,会利用修改后的模板来创建
Ret, handled,callNext OnPostCreateInstance(template, obj, userdata)
该事件在模板被实例化之后触发,其中obj参数指定了该模板新实例化出来的object对象,obj的类型根据模板的类型不同而不同,具体的来说
l objecttemplate模板,那么obj是对应的LayoutObject类型,比如ImageObject、TextureObject或者用户自定义control等
l hostwndtemplate模板,那么obj是对应的hostwnd类型,比如FrameHostWnd、MenuHostWnd等
l animationtemplate模板,那么obj是对应的animation类型,比如PosChangeAnimation等
l objtreetemplate模板,那么obj是UIObjectTree类型
如果需要对模板实例化后的对象进行修改(修改属性或者挂接事件等等),可以响应这个事件,
然后利用实例对象(obj参数)来修改实例,这样修改的话,不会影响到模板本身,只对当前实例有效
上面两个事件当中,最后一个参数都是一个userdata,是为了方便使用而增设的,userdata需要在使用某个模板实例化对象(CreateInstance)时候,根据需要传入,
可以是任何lua支持的数据类型(包括函数,表等),下面会有详细的例子
模板事件可以在xml里面静态配置,也可以在拿到模板对象之后,动态的挂接上去:
l 静态配置
<objtreetemplate id="objtree" >
<attr>
。。。。。。
</attr>
<templateeventlist>
<event name="OnPreCreateInstance">
</event>
<event name="OnPostCreateInstance">
</event>
</templateeventlist>
</ objtreetemplate >
也就是模板节点下面,增加了一个templateeventlist节点,所有关于模板的事件都会添加到这个节点下面(目前只有上述两个事件)
这里需要注意的是,这个事件是跟模板对象相关系的,而和由模板实例化出来的对象没有关系
objecttemplate、hostwndtemplate、animationtemplate、objecttemplate四种模板的配置方式相同
这里需要注意的是,假如模板有继承,那么templateeventlist也会受继承的影响,和eventlist节点的继承规则相同
l 动态挂接
local templateMananger = XLGetObject("Xunlei.UIEngine.TemplateManager")
local frameHostWndTemplate = templateMananger:GetTemplate("test.mainwnd","HostWndTemplate")
local function OnPreCreateInstance(template, userdata)
……
end
local cookie = frameHostWndTemplate:AttachListener(“OnPreCreateInstance”, true, OnPreCreateInstance)
。。。。。。
frameHostWndTemplate:RemoveListener(cookie)
挂接事件的方式和普通的object挂接事件的方式无甚区别,可以挂接一个或者多个事件
下面举例重点说明一下userdata的使用
比如我在xml里面配置了一个hostwnd模板,如下所示
<hostwndtemplate id="bolt.mainwnd" class="FrameHostWnd" >
<attr>
……
</attr>
<eventlist>
……
</eventlist>
<templateeventlist>
<event name="OnPreCreateInstance">
local arg = {...}
local userdata = arg[2]
userdata() --因为userdata是一个函数
</event>
<event name="OnPostCreateInstance">
XLMessageBox("OnPostCreateInstance")
local arg = {...}
XLMessageBox("templateid="..arg[1]:GetID()..",objid="..arg[2]:GetID())
local userdata = arg[3]
userdata() --因为userdata是一个函数
</event>
</templateeventlist>
</hostwndtemplate>
其中在OnPreCreateInstance和OnPostCreateInstance 两个事件里面都使用了userdata,再看userdata的来源:
local templateMananger = XLGetObject("Xunlei.UIEngine.TemplateManager")
local frameHostWndTemplate = templateMananger:GetTemplate("bolt.mainwnd","HostWndTemplate")
local function OnCreateInstanceCallBack()
XLMessageBox("OnCreateInstance CallBack")
end
local frameHostWnd = frameHostWndTemplate:CreateInstance("Bolt.MainFrame", nil, OnCreateInstanceCallBack)
userdata是在模板实例化的操作CreateInstance里面传入的,也就是第三个参数,前面两个参数分别对应对象的id和packagename,
对于上面所述的四种模板,调用方式和参数是完全一致的。
这个参数可以不设置,默认为nil
另外模板新增加了GetID和GetPackageName方法,用来获取该模板的id和所在的xar的id,如果需要了解模板修改、使用等关于模板的
更多内容,请参考之前的一份文档《模板指南》