覆盖 NumericUpDown 中的移位行为
Overrite shift behavior in NumericUpDown
根据用户请求,我按照此 answer 中的建议实现了具有不同增量的 NumericUpDown(按下箭头时为 0.1,按下 SHIFT+ 箭头时为 0.01)。当用户与鼠标交互以按下控件的箭头时,它工作得很好。
但是,当按下 SHIFT 时,带有向上箭头的键盘输入不会触发 UpButton()(对于向下键和 DownButton() 也是如此)。相反,正在选择控件中的文本。由于正常行为是在按下键盘箭头时触发这两种方法,当然我也想为 SHIFT 组合保持此功能。
到目前为止,我已经尝试覆盖包含 "Key" 单词的 NumericUpDown 中的每个方法,但 none 可以帮助我。 ProcessCmdKey 可以检测组合键并禁用默认选择行为,但它也不会导致 UpButton/DownButton 被触发。
有什么想法吗?
Shift + Up/Down 是 NumericUpdate 文本框部分的文本选择快捷键。就像它们用于常规 TextBox 一样。禁用此功能不是最好的主意。
执行此操作的方法有多种,也许最简单的方法是在重写表单的 ProcessCmdKey() 方法中检测击键。所以他们可以在任何 NUD 上工作,并且代码更改很小。我将 post 它的 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);
}
根据用户请求,我按照此 answer 中的建议实现了具有不同增量的 NumericUpDown(按下箭头时为 0.1,按下 SHIFT+ 箭头时为 0.01)。当用户与鼠标交互以按下控件的箭头时,它工作得很好。
但是,当按下 SHIFT 时,带有向上箭头的键盘输入不会触发 UpButton()(对于向下键和 DownButton() 也是如此)。相反,正在选择控件中的文本。由于正常行为是在按下键盘箭头时触发这两种方法,当然我也想为 SHIFT 组合保持此功能。
到目前为止,我已经尝试覆盖包含 "Key" 单词的 NumericUpDown 中的每个方法,但 none 可以帮助我。 ProcessCmdKey 可以检测组合键并禁用默认选择行为,但它也不会导致 UpButton/DownButton 被触发。
有什么想法吗?
Shift + Up/Down 是 NumericUpdate 文本框部分的文本选择快捷键。就像它们用于常规 TextBox 一样。禁用此功能不是最好的主意。
执行此操作的方法有多种,也许最简单的方法是在重写表单的 ProcessCmdKey() 方法中检测击键。所以他们可以在任何 NUD 上工作,并且代码更改很小。我将 post 它的 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);
}