如何将用户控件内元素事件抛给父HMI控件及实现自定义事件触发?
HMI用户控件自定义输入事件实现方案
一、创建用户控件专属的事件触发符号
打开用户控件编辑界面,在专属符号表(不要使用HMI全局内部符号)中创建以下符号:
- 数字输入相关:布尔型
bNumericInputRequested(触发键盘显示)、bNumericInputClosing(触发键盘隐藏);整数型nNumInputX、nNumInputY(存储触发控件的屏幕坐标) - 字母输入相关:布尔型
bAlphabetInputRequested、bAlphabetInputClosing;整数型nAlphaInputX、nAlphaInputY
二、绑定内部控件焦点事件到符号
选中用户控件内的输入控件,配置焦点事件逻辑:
- 数字输入控件的
.onFocusIn事件:执行WriteToSymbol操作,将bNumericInputRequested设为TRUE,同时把当前控件的屏幕坐标写入nNumInputX、nNumInputY - 数字输入控件的
.onFocusOut事件:执行WriteToSymbol操作,将bNumericInputClosing设为TRUE - 字母输入控件同理,将
.onFocusIn绑定到bAlphabetInputRequested = TRUE,.onFocusOut绑定到bAlphabetInputClosing = TRUE
三、在HMI页面监听用户控件实例的事件
将用户控件拖入HMI页面后,每个实例会自动带上专属符号(例如UserControl_1.bNumericInputRequested):
- 给HMI页面添加逻辑监听这些符号的上升沿:
- 监听
UserControl_1.bNumericInputRequested:触发显示数字键盘,读取nNumInputX、nNumInputY定位键盘位置 - 监听
UserControl_1.bNumericInputClosing:触发隐藏数字键盘,之后需把bNumericInputClosing重置为FALSE(避免重复触发)
- 监听
- 多实例场景下,每个实例的符号独立命名,分别对应监听即可
四、优化细节
- 为避免单次焦点事件重复触发监听,可在用户控件内部添加逻辑:当
bNumericInputRequested被设为TRUE后,延迟100ms左右自动重置为FALSE - 如果直接获取控件坐标有问题,可提前在用户控件内部将每个输入控件的坐标存入对应符号
内容的提问来源于stack exchange,提问作者mijmij
相关产品推荐
相关产品推荐

