如何阻止 NumericUpDown 在 EnterKeyPress 上播放“Ding”声音
本文关键字:Ding 声音 播放 何阻止 NumericUpDown EnterKeyPress | 更新日期: 2023-09-27 18:34:56
我的窗体上有几个NumericUpDown
控件,每次我在它处于活动状态时按回车键时,它都会在我耳边播放这种可怕的 DING 噪音。如果我不处理 KeyPress
事件,它会播放,如果我处理KeyPress
事件,它会播放,无论是否e.Handled = true
:
myNumericUpDown.KeyPress += myNumericUpDown_KeyPress;
private void myNumericUpDown_KeyPress(object sender, EventArgs e)
{
if (e.KeyChar == 13)
{
e.Handled = true; //adding / removing this has no effect
myButton.PerformClick();
}
}
而且我不认为它正在发生,因为我正在处理它,就好像我没有注册事件(删除上面的第一行(,它仍然播放噪音。
使用 KeyDown(( 和 SuppressKeyPress,但单击 KeyUp(( 中的按钮:
private void myNumericUpDown_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
e.Handled = e.SuppressKeyPress = true;
}
}
private void myNumericUpDown_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
e.Handled = e.SuppressKeyPress = true;
myButton.PerformClick();
}
}
*如果您将表单AcceptButton
属性设置为"myButton",则根本不需要代码!
NumericUpDown 还会检查您按下的键是否是"数字键"(1-9,-,.(,这显然不是 Enter 键的情况。完成您想做的事情后,只需将e.KeyChar
设置为任何数字键即可。设置e.Handled = true
仍然是必要的,否则系统会将您的输入视为您实际按下该键并插入数字。
//Do something
e.Handled = true;
e.KeyChar = (char)Keys.D2;
对我来说,这非常有效。
好吧,您不应该像在 GUI 应用程序中那样使用 Enter 键。 它保留给另一个角色。 叮!是对此的不加掩饰的提醒。
您可以通过实际为 Enter 键提供预期用法来轻松取消它。 在窗体上放置一个按钮,将其 Visible 属性设置为 False。 选择窗体并将"接受按钮"属性设置为该按钮。 不再叮叮当当。
从 Enter 的奇怪用法中推断出,你可能希望使 Enter 键的行为与在控制台模式应用中的行为类似,将用户带到下一个控件。 通常改用 Tab 键完成。 您可以通过将此代码复制/粘贴到窗体类中来实现此目的并取消 UI:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == Keys.Enter) {
var ctl = this.ActiveControl;
var box = ctl as TextBoxBase;
// Make Enter behave like Tab, unless it is a multiline textbox
if (ctl != null && (box == null || !box.Multiline)) {
this.SelectNextControl(ctl, true, true, true, true);
return true;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
我做这个技巧:
在 numericUpandDown
KeyPress 函数中,如果e.KeyChar=13
(Enter 键(,则必须设置e.Handled=true;
(这将防止控件以任何方式更改其值(,紧随其后的set e.KeyChar=(char)46;
(或任何其他数字接受值,它不会被写入e.Handled
已经设置为 true(。
这样,e.KeyChar
具有Visual Studio可接受的值,并且"Ding"不会发出声音。