如何在wxErlang中获取XRC加载对象层级的子控件引用?
获取XRC加载控件的引用并绑定事件(Erlang/wxErlang)
核心方案
使用wxWindow:findWindow/2函数,通过XRC中定义的控件name属性,从已加载的Frame中递归查找目标控件,之后即可正常绑定事件处理函数。
具体步骤
- 查找控件引用
在加载Frame后,调用wxWindow:findWindow/2,传入Frame对象和XRC里控件的name值:
MyXrcButton = wxWindow:findWindow(MyXrcFrame, "ID_BUTTON_CONNECT_TO_SERVER"),
- 绑定点击事件
拿到控件引用后,和手动创建的控件一样调用wxButton:connect/3绑定事件:
wxButton:connect(MyXrcButton, command_button_clicked, [{callback, fun handle_click_dlg/2}, {userData, #{frame => MyXrcFrame, env => wx:get_env()}}]),
完整代码示例
-module(xt4). -export([start/0]). -include_lib("wx/include/wx.hrl"). start() -> wx:new(), WxXmlResource = wxXmlResource:new(), wxXmlResource:load(WxXmlResource, "TryMyLayout1.xrc"), MyXrcFrame = wxXmlResource:loadFrame(WxXmlResource, wx:null(), "ID_MAINFRAME"), % 查找XRC中定义的按钮 ConnectButton = wxWindow:findWindow(MyXrcFrame, "ID_BUTTON_CONNECT_TO_SERVER"), % 绑定点击事件回调 wxButton:connect(ConnectButton, command_button_clicked, [{callback, fun handle_click_dlg/2}, {userData, #{frame => MyXrcFrame, env => wx:get_env()}}]), wxFrame:show(MyXrcFrame), % 启动事件循环(wx:destroy()会等待事件循环结束) wx:destroy(). handle_click_dlg(#wx{userData = #{frame := Frame, env := Env}}, _Event) -> wx:set_env(Env), MsgDlg = wxMessageDialog:new(Frame, "Inside handle_click_dlg"), wxDialog:showModal(MsgDlg), wxDialog:destroy(MsgDlg). % 销毁对话框释放资源
注意事项
wxWindow:findWindow/2会递归遍历所有子控件,无论嵌套层级多深,只要name匹配就能找到。- 确保XRC中控件的
name属性和查找时的字符串完全一致(大小写敏感)。 - 若需要绑定多个控件,重复执行“查找+绑定”流程即可,比如处理
ID_BUTTON_CREATE_SERVER按钮同理。
内容的提问来源于stack exchange,提问作者Steve P
相关产品推荐
相关产品推荐

