【问题标题】:Overrite shift behavior in NumericUpDown覆盖 NumericUpDown 中的移位行为
【发布时间】:2025-12-31 10:50:10
【问题描述】:

按照answer 中的建议,根据用户请求,我以不同的增量(按箭头时为 0.1,按 SHIFT+箭头时为 0.01)实现了 NumericUpDown。当用户与鼠标交互以按下控件的箭头时,它的效果非常好。

但是,当按下 SHIFT 时,带有向上箭头的键盘输入不会触发 UpButton()(对于 Down 键和 DownButton() 也是如此)。而是选择控件中的文本。由于正常行为是在按下键盘箭头时触发这两种方法,所以我当然也希望为 SHIFT 组合保留此功能。

到目前为止,我已经尝试覆盖 NumericUpDown 中包含“Key”字样的每个方法,但没有一个可以帮助我。 ProcessCmdKey 可以检测组合键并禁用默认选择行为,但也不会导致触发 UpButton/DownButton。

有什么想法吗?

【问题讨论】:

  • 我已将 C++ 标签更改为 C++-CLI,因为您显然没有使用 C++。

标签: winforms c++-cli numericupdown


【解决方案1】:

Shift + Up/Down 是 NumericUpdate 的文本框部分的文本选择快捷键。就像它们用于常规文本框一样。禁用此功能并不是最好的主意。

有多种方法可以做到这一点,也许最简单的方法是在表单的 ProcessCmdKey() 方法的覆盖中检测击键。所以他们可以在任何 NUD 上工作,并且代码更改很小。我将发布它的 C# 版本,这些天在 C++/CLI 中创建一个 winforms 应用程序太麻烦了:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
    var ctl = this.ActiveControl as NumericUpDown;
    if (ctl != null) {
        if (keyData == (Keys.Up | Keys.Shift)) {
            ctl.Value = Math.Min(ctl.Maximum, ctl.Value + 10 * ctl.Increment);
            return true;
        }
        if (keyData == (Keys.Down | Keys.Shift)) {
            ctl.Value = Math.Max(ctl.Minimum, ctl.Value - 10 * ctl.Increment);
            return true;
        }
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

【讨论】: