我有一个NumericUpdown -对于某些用户来说是只读的。这也会禁用控件的contextmenu(右键单击)-在这种情况下,这不是intendet,因为它提供了一些功能,如复制值等。有没有一种方法使控件呈现为只读,但保持上下文菜单启用?比如重写OnContextMenuShown()来删除只读约束?
OnContextMenuShown()
5q4ezhmt1#
想明白了问题是,当控件是readonly时,点击被发送到父容器,而不是控件本身。因此,甚至不可能覆盖控件自己的Mouse-Events来处理此问题。因此,我现在添加了一个逻辑,每当NumericUpDown设置为readonly时,它就可以挂接到父OnClick-Event。如果设置回Enabled,则需要再次删除处理程序。
readonly
NumericUpDown
OnClick
Enabled
private MouseEventHandler RightClickParentHandler; ... //hook into the parent containers MouseClick-Listener to detect rightclicks that should appear //on this (readonly) control. Remove Listener, if control becomes enabled again. if (this.ReadOnly) { if (this.RightClickParentHandler == null) { this.RightClickParentHandler = new MouseEventHandler((o, e) => { NumericUpDown ctl = this.Parent.GetChildAtPoint(e.Location) as NumericUpDown; if (ctl == this) { if (this.ContextMenuStrip != null) { this.ContextMenuStrip.Show(this.Parent, e.Location); } } }); this.Parent.MouseClick += this.RightClickParentHandler; } } else { if (this.RightClickParentHandler != null) { this.Parent.MouseClick -= this.RightClickParentHandler; this.RightClickParentHandler = null; } }
1条答案
按热度按时间5q4ezhmt1#
想明白了问题是,当控件是
readonly
时,点击被发送到父容器,而不是控件本身。因此,甚至不可能覆盖控件自己的Mouse-Events来处理此问题。因此,我现在添加了一个逻辑,每当
NumericUpDown
设置为readonly时,它就可以挂接到父OnClick
-Event。如果设置回
Enabled
,则需要再次删除处理程序。