ContextMenu
上下文菜单 UI 组件

说明
右键点击图形对象或 UI 组件时,上下文菜单 UI 组件会显示一组菜单项。在创建上下文菜单后,使用 ContextMenu 对象修改其外观和行为。
创建对象
使用 uicontextmenu 函数在图窗中创建一个上下文菜单。
属性
回调
上下文菜单打开回调函数,指定为下列值之一:
函数句柄。
第一个元素是函数句柄的元胞数组。元胞数组中的后续元素是传递到回调函数的参量。
包含有效 MATLAB® 表达式的字符向量(不推荐)。MATLAB 在基础工作区计算此表达式。
有关将回调属性值指定为函数句柄、元胞数组或字符向量的详细信息,请参阅Specify a Callback Function。
此回调函数在上下文菜单打开以响应用户交互时执行。您可以使用此回调函数根据用户右键点击的内容来自定义上下文菜单的外观。
此回调函数可以访问有关用户与 App 的交互的特定信息。MATLAB 将 ContextMenuOpeningData 对象中的此信息作为第二个参量传递给回调函数。在 App 设计工具中,该参量名为 event。您可以使用圆点表示法查询对象属性。例如,event.ContextObject 返回有关用户打开上下文菜单时右键点击的组件的信息。
注意
虽然您可以为任何上下文菜单指定 ContextMenuOpeningFcn 回调,但回调事件数据中的 ContextMenuOpeningData 对象仅在上下文菜单满足以下两个条件时才可用:
上下文菜单与基于
uifigure的 App 相关联(例如在 App 设计工具中创建的 App)。上下文菜单与 UI 组件(而不是图形对象,如
Axes或Line对象)相关联,或与仅包含 UI 组件的容器相关联。
下表列出了 ContextMenuOpeningData 对象的属性。
| 属性 | 值 |
|---|---|
ContextObject | App 用户打开上下文菜单时右键点击的对象 |
InteractionInformation | 有关 App 用户在组件中打开上下文菜单时右键点击的位置的信息。根据 例如,如果 |
Source | 执行回调的上下文菜单对象 |
EventName | 'ContextMenuOpening' |
下表列出了 InteractionInformation 对象的属性。这些属性取决于 App 用户打开上下文菜单时右键点击的对象。
ContextObject | InteractionInformation 属性 | 值 |
|---|---|---|
| 任一值 | Location | 用户右键点击的位置相对于
|
ScreenLocation | 用户右键点击的位置相对于其主显示画面左下角的位置,以
| |
Table | DisplayRow | 用户右键点击的在表中直观显示的行,以数值标量形式返回。 如果用户没有对表进行排序,则 |
DisplayColumn | 用户右键点击的在表中直观显示的列,以数值标量形式返回。 如果用户没有重新排列表,则 | |
Row | 用户右键点击的对应于原始表数据的行,以数值标量形式返回。 如果用户没有对表进行排序,则 | |
Column | 用户右键点击的对应于原始表数据的列,以数值标量形式返回。 如果用户没有重新排列表,则 | |
RowHeader | 用户是否右键点击了表的行标题,以逻辑值 0 (false) 或 1 (true) 形式返回。 | |
ColumnHeader | 用户是否右键点击了表的列标题,以逻辑值 0 (false) 或 1 (true) 形式返回。 | |
Tree | Node | 右键点击的节点,以 如果用户右键点击了树中未关联到节点的区域,则 |
Level | 所右键点击节点的级别,以数值标量形式返回。 如果用户右键点击了树中未关联到节点的区域,则 | |
ListBox | Item | 右键点击的列表框项的索引,以数值标量形式返回。 如果用户右键点击了列表框中与项无关的区域,则 |
对象创建函数,指定为下列值之一:
函数句柄。
第一个元素是函数句柄的元胞数组。元胞数组中的后续元素是传递到回调函数的参量。
包含有效 MATLAB 表达式的字符向量(不推荐)。MATLAB 在基础工作区计算此表达式。
有关将回调指定为函数句柄、元胞数组或字符向量的详细信息,请参阅App 设计工具中的回调。
此属性指定要在 MATLAB 创建对象时执行的回调函数。MATLAB 将在执行 CreateFcn 回调之前初始化所有属性值。如果不指定 CreateFcn 属性,则 MATLAB 执行默认的创建函数。
对现有组件设置 CreateFcn 属性没有任何作用。
如果将此属性指定为函数句柄或元胞数组,则可以使用回调函数的第一个参量访问正在创建的对象。否则,使用 gcbo 函数访问该对象。
对象删除函数,指定为下列值之一:
函数句柄。
第一个元素是函数句柄的元胞数组。元胞数组中的后续元素是传递到回调函数的参量。
包含有效 MATLAB 表达式的字符向量(不推荐)。MATLAB 在基础工作区计算此表达式。
有关将回调指定为函数句柄、元胞数组或字符向量的详细信息,请参阅App 设计工具中的回调。
此属性指定在 MATLAB 删除对象时要执行的回调函数。MATLAB 在销毁对象的属性之前执行 DeleteFcn 回调。如果不指定 DeleteFcn 属性,则 MATLAB 执行默认的删除函数。
如果将此属性指定为函数句柄或元胞数组,则可以使用回调函数的第一个参量访问要删除的对象。否则,使用 gcbo 函数访问该对象。
回调执行控件
回调中断,指定为 'on' 或 'off',或者指定为数值或逻辑值 1 (true) 或 0 (false)。值 'on' 等效于 true,'off' 等效于 false。因此,您可以使用此属性的值作为逻辑值。该值存储为 matlab.lang.OnOffSwitchState 类型的 on/off 逻辑值。
此属性确定是否可以中断运行中回调。有以下两种回调状态要考虑:
运行中回调是当前正在执行的回调。
中断回调是试图中断运行中回调的回调。
每次执行处理回调队列的命令时,MATLAB 都会确定回调中断行为。这些命令包括 drawnow、figure、uifigure、getframe、waitfor 和 pause。
如果运行中回调不包含上述命令之一,则不会发生中断。MATLAB 首先完成执行运行中回调,然后执行中断回调。
如果运行中回调确实包含上述命令之一,则由运行中回调所属对象的 Interruptible 属性来确定是否发生中断:
如果
Interruptible的值为'off',则不会发生中断。此时,由中断回调所属对象的BusyAction属性确定中断回调是被丢弃还是添加到回调队列中。如果
Interruptible的值为'on',则发生中断。下次 MATLAB 处理回调队列时,它会停止运行中回调的执行,并执行中断回调。在中断回调完成后,MATLAB 将继续执行运行中回调。
注意
回调的中断和执行在以下情况下会有不同的表现:
如果中断回调是
DeleteFcn、CloseRequestFcn或SizeChangedFcn回调,则无论是否存在Interruptible属性值都会发生中断。如果运行中回调当前正在执行
waitfor函数,则无论是否存在Interruptible属性值都会发生中断。如果中断回调由
Timer对象所有,则回调将根据调度执行,而不考虑Interruptible属性值。
回调排队,指定为 'queue' 或 'cancel'。BusyAction 属性决定 MATLAB 如何处理中断回调的执行。有以下两种回调状态要考虑:
运行中回调是当前正在执行的回调。
中断回调是试图中断运行中回调的回调。
BusyAction 属性仅在同时满足以下两个条件时才确定回调排队行为:
在这些情况下,由中断回调所属对象的 BusyAction 属性确定 MATLAB 如何处理中断回调。以下是 BusyAction 属性的可能值:
'queue'- 将中断回调放入队列中,以便在运行中回调执行完毕后进行处理。'cancel'- 不执行中断回调。
此 属性 为只读。
删除状态,以 matlab.lang.OnOffSwitchState 类型的 on/off 逻辑值形式返回。
当 DeleteFcn 回调开始执行时,MATLAB 会将 BeingDeleted 属性设置为 'on'。BeingDeleted 属性将一直保持 'on' 设置状态,直到组件对象不再存在为止。
在查询或修改对象之前,请先检查其 BeingDeleted 属性的值,以确认它不是待删除项。
父级/子级
上下文菜单子级,以空的 GraphicsPlaceholder 或 Menu 对象的向量形式返回。
不能使用 Children 属性添加或删除子级。可以使用此属性查看子级列表或对子菜单项重新排序。子级在此数组中的顺序与菜单项在打开的上下文菜单中出现的顺序相反。
例如,以下代码创建三个上下文菜单。当您在运行的 App 中打开上下文菜单时,Menu1 将作为第一个菜单选项出现。
fig = uifigure; cm = uicontextmenu(fig); m1 = uimenu(cm,'Text','Menu1'); m2 = uimenu(cm,'Text','Menu2'); m3 = uimenu(cm,'Text','Menu3'); fig.ContextMenu = cm;

cm.Children 以相反顺序返回菜单项列表。
cm.Children
ans = 3×1 Menu array: Menu (Menu3) Menu (Menu2) Menu (Menu1)
HandleVisibility 属性设置为 'off' 的对象不会列在 Children 属性中。
要向此列表添加子级,请将另一个 Menu 对象的 Parent 属性设置为此 ContextMenu 对象。
对象句柄的可见性,指定为 'on'、'callback' 或 'off'。
此属性控制对象在其父级的子级列表中的可见性。当对象未显示在其父级的子级列表中时,通过搜索对象层次结构或查询属性来获取对象的函数不会返回该对象。这些函数包括 get、findobj、gca、gcf、gco、newplot、cla、clf 和 close。HandleVisibility 属性还控制对象句柄是否显示在父图窗的 CurrentObject 属性中。对象即使在不可见时也有效。如果可以访问某个对象,则可以设置和获取其属性,并将其传递给针对对象进行运算的任意函数。
| HandleVisibility 值 | 描述 |
|---|---|
'on' | 对象句柄始终可见。 |
'callback' | 对象句柄在回调或回调所调用的函数中可见,但在从命令行调用的函数中不可见。此选项阻止通过命令行访问对象,但允许回调函数访问对象。 |
'off' | 对象句柄始终不可见。该选项用于防止另一函数无意中对 UI 进行更改。将 HandleVisibility 设置为 'off' 可在执行该函数时暂时隐藏句柄。 |
示例
创建这样一个上下文菜单,每次打开该上下文菜单时都会在命令行窗口中显示一条消息。
在图窗中创建一个线图。然后,创建包含一个菜单项的上下文菜单,并将该菜单分配给线图。创建一个 ContextMenuOpeningFcn 回调函数,它在每次上下文菜单打开时在命令行窗口中显示输出。
f = figure; cm = uicontextmenu(f); m = uimenu(cm,"Text","Menu1"); cm.ContextMenuOpeningFcn = @(src,event)disp("Context menu opened"); p = plot(1:10,"ContextMenu",cm);
要查看上下文菜单,请右键点击绘图线条。当上下文菜单打开时,命令行窗口显示 Context menu opened。
![]()
自 R2023b 起
创建一个显示超链接的 App,并允许用户使用上下文菜单将链接 URL 复制到剪贴板。
在名为 hyperlinkApp.m 的文件中,编写实现该 App 的函数:
创建一个 UI 图窗和一个网格布局管理器,以对该 App 进行布局。
在网格布局管理器中创建两个超链接。
创建一个具有 Copy Hyperlink 菜单项的上下文菜单,并将该上下文菜单分配给两个超链接。
编写一个名为
copyHyperlink的回调函数。在该回调函数中,通过使用event.ContextObject事件数据访问右键点击的Hyperlink对象,然后将 URL 复制到剪贴板。将该函数赋给菜单项的MenuSelectedFcn回调属性。有关回调的详细信息,请参阅Create Callbacks for Apps Created Programmatically。
function hyperlinkApp fig = uifigure; g = uigridlayout(fig,[2, 1]); g.RowHeight = {'fit','fit'}; hlink1 = uihyperlink(g); hlink1.Text = "MathWorks Home"; hlink1.URL = "https://www.mathworks.com/"; hlink2 = uihyperlink(g); hlink2.Text = "MATLAB App Building"; hlink2.URL = "https://www.mathworks.com/products/matlab/app-designer.html"; cm = uicontextmenu(fig); m = uimenu(cm); m.Text = "Copy Hyperlink"; hlink1.ContextMenu = cm; hlink2.ContextMenu = cm; m.MenuSelectedFcn = @copyHyperlink; end function copyHyperlink(src,event) url = event.ContextObject.URL; clipboard("copy",url) end
在 R2023b 之前的版本中: 编写回调函数,以通过查询图窗的 CurrentObject 属性(而不是使用 event.ContextObject 事件数据)访问右键点击的 Hyperlink 对象。
运行 hyperlinkApp 函数。右键点击其中一个超链接,然后选择 Copy Hyperlink 来复制链接 URL。
![]()
自 R2023b 起
创建一个 App,它显示一个表并允许用户使用上下文菜单项删除行。对上下文菜单项进行编程,使其仅在用户右键点击表数据行时出现。
在名为 tableApp.m 的文件中,编写实现该 App 的函数:
创建一个 UI 图窗并用一些随机数据创建一个表 UI 组件。
创建一个具有 Delete Row 菜单项的上下文菜单,并将该上下文菜单分配给表。
编写两个回调函数来响应上下文菜单操作:
deleteRow- 查询右键点击的表行,然后删除该行。toggleVisibility- 当用户右键点击一个表数据行时显示 Delete Row 菜单项,否则隐藏该项。
在每个回调中,使用
event.InteractionInformation回调事件数据来访问有关用户在表中为打开上下文菜单而右键点击的位置的信息。将
deleteRow函数赋给该菜单项的MenuSelectedFcn回调属性,将toggleVisibility函数赋给上下文菜单的ContextMenuOpeningFcn回调属性。有关回调的详细信息,请参阅Create Callbacks for Apps Created Programmatically。
function tableApp fig = uifigure; tbl = uitable(fig); tbl.Position = [20 20 400 300]; tbl.Data = randi(10,[10 4]); cm = uicontextmenu(fig); m = uimenu(cm); m.Text = "Delete Row"; tbl.ContextMenu = cm; m.MenuSelectedFcn = @deleteRow; cm.ContextMenuOpeningFcn = @(src,event)toggleVisibility(src,event,m); end function deleteRow(src,event) tbl = event.ContextObject; row = event.InteractionInformation.Row; tbl.Data(row,:) = []; end function toggleVisibility(src,event,m) row = event.InteractionInformation.Row; rowClicked = ~isempty(row); m.Visible = rowClicked; end
运行 tableApp 函数,然后右键点击该表。仅当右键点击表行时,上下文菜单才会出现。选择 Delete Row 项以删除右键点击的行。
![]()
存储在 event.InteractionInformation 属性中的特定回调事件数据取决于用户为打开上下文菜单而右键点击的 UI 组件。有关详细信息,请参阅关于 Menu 和 ContextMenu 的回调属性描述。
自 R2023b 起
为树组件创建一个上下文菜单。根据用户右键点击的树节点级别自定义上下文菜单操作。
在当前文件夹的新脚本中,创建一个 UI 图窗。然后,创建一个树,其中包含四个顶层节点和一组嵌套节点。
fig = uifigure; t = uitree(fig,"Position",[20 200 175 100]); category1 = uitreenode(t,"Text","Runners"); r1 = uitreenode(category1,"Text","Joe"); r2 = uitreenode(category1,"Text","Linda"); category2 = uitreenode(t,"Text","Cyclists"); c1 = uitreenode(category2,"Text","Rajeev"); category3 = uitreenode(t,"Text","Hikers"); h1 = uitreenode(category3,"Text","Jack"); category4 = uitreenode(t,"Text","Swimmers"); s1 = uitreenode(category4,"Text","Logan");
![]()
创建一个上下文菜单,其中包含一个菜单项和两个子菜单,用户可以点击该上下文菜单来展开单个树节点或所有树节点。对于每个子菜单,指定当用户选择菜单选项时要执行的 MenuSelectedFcn 回调函数。
cm = uicontextmenu(fig); m1 = uimenu(cm,"Text","Expand..."); sbm1 = uimenu(m1,"Text","This Node", ... "MenuSelectedFcn",@expandSingle); sbm2 = uimenu(m1,"Text","All Nodes", ... "MenuSelectedFcn",@expandAll);
通过将每个节点的 ContextMenu 属性设置为 ContextMenu 对象,将上下文菜单分配给顶层树节点。
category1.ContextMenu = cm; category2.ContextMenu = cm; category3.ContextMenu = cm; category4.ContextMenu = cm;
在文件的底部,定义 expandSingle 和 expandAll 回调函数。定义函数来接受 MATLAB 传递给所有回调函数的源和事件数据。使用 event.InteractionInformation 和 event.ContextObject 属性来访问有关用户为打开上下文菜单而右键点击的位置的信息。
function expandSingle(src,event) node = event.InteractionInformation.Node; expand(node) end function expandAll(src,event,t) n = event.ContextObject; t = ancestor(n,"uitree"); expand(t) end
保存并运行脚本。右键点击任一顶层树节点可查看上下文菜单。
![]()
版本历史记录
在 R2006a 之前推出当 ContextMenuOpeningFcn 回调与 UI 组件上的一个上下文菜单相关联时,该回调具有附加事件数据。使用此数据在 App 中自定义和共享上下文菜单。
| 事件数据属性 | 描述 |
|---|---|
ContextObject | App 用户打开上下文菜单时右键点击的对象 |
InteractionInformation | 有关 App 用户在组件中打开上下文菜单时右键点击的位置的信息,例如表的单元格 |
从 R2020a 开始,不推荐使用 ContextMenu 对象的 Callback 属性。请改用 ContextMenu 对象的 ContextMenuOpeningFcn 属性。属性值是相同的。
目前没有停止支持 ContextMenu 对象的 Callback 属性的计划。但是,此属性将不再出现在对 ContextMenu 对象调用 get 函数时所返回的列表中。
从 R2020a 开始,不推荐使用 Visible 和 Position 属性来配置在特定位置打开的上下文菜单。在使用 uifigure 函数创建的 App 中,请改用 open 函数。
当前没有停止支持 ContextMenu 对象的 Visible 和 Position 属性的计划。但是,这些属性将不再出现在对 ContextMenu 对象调用 get 函数时所返回的列表中。
另请参阅
uimenu | uicontextmenu | open
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)