winforms NumericUpDown / ReadOnly,但是contextmenu?

vltsax25  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(182)

我有一个NumericUpdown -对于某些用户来说是只读的。
这也会禁用控件的contextmenu(右键单击)-在这种情况下,这不是intendet,因为它提供了一些功能,如复制值等。
有没有一种方法使控件呈现为只读,但保持上下文菜单启用?
比如重写OnContextMenuShown()来删除只读约束?

5q4ezhmt

5q4ezhmt1#

想明白了问题是,当控件是readonly时,点击被发送到父容器,而不是控件本身。因此,甚至不可能覆盖控件自己的Mouse-Events来处理此问题。
因此,我现在添加了一个逻辑,每当NumericUpDown设置为readonly时,它就可以挂接到父OnClick-Event。
如果设置回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;
    }
}

相关问题