You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在wxErlang中获取XRC加载对象层级的子控件引用?

获取XRC加载控件的引用并绑定事件(Erlang/wxErlang)

核心方案

使用wxWindow:findWindow/2函数,通过XRC中定义的控件name属性,从已加载的Frame中递归查找目标控件,之后即可正常绑定事件处理函数。

具体步骤

  1. 查找控件引用
    在加载Frame后,调用wxWindow:findWindow/2,传入Frame对象和XRC里控件的name值:
MyXrcButton = wxWindow:findWindow(MyXrcFrame, "ID_BUTTON_CONNECT_TO_SERVER"),
  1. 绑定点击事件
    拿到控件引用后,和手动创建的控件一样调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 20:14:49