防止WinForm AcceptButton处理返回键
我有一个表单,其中一个按钮连接到AcceptButton
属性,以便在用户按下Return键时发生逻辑并关闭表单。
在该表单上,我显示了一个动态创建的TextBox
,当用户双击某个区域然后在用户按下Return时隐藏该TextBox
。
当TextBox
具有焦点时,如果用户按下Return键,如何防止表单处理按键?
我试图通过KeyEventArgs.Handled
在TextBox.KeyDown
事件处理程序中处理按键,但我的接受按钮的Button.Click
事件首先被触发…
使用TextBox
的Enter
和Leave
事件将AcceptButton
属性设置为null
(在Enter
)并重新分配按钮(在Leave
)。
虽然在TextBox具有焦点时重置Forms AcceptButton
会起作用,但我相信更合适的解决方案是使用TextBoxes AcceptsReturn
属性。
如果你设置
myTextBox.AcceptsReturn = true;
按下RETURN时表单不会接受,但您的TextBox可以自行处理。
这样可以避免在代码中的多个位置重置AcceptButton。
在创建该文本框时将AcceptButton
属性设置为null,并在失去焦点时将其设置回正常值:
var myTextBox = new TextBox ... ; AcceptButton = null; myTextBox.Leave += (s, e) => { AcceptButton = btnOK; };
要获得完整的工作示例,请使用TextBox的AcceptReturn = true作为NobodysNightmare建议 ,并将SuppressKeyPress设置为true以避免将事件冒泡到Form。 要使用AcceptButton,您需要在FredrikMörk建议进入/离开texbox时设置/重置AcceptButton属性。
var tb = new TextBox ...; IButtonControl _oldAcceptButton = null; tb.AcceptReturn=true; tb.KeyDown += (s,e) => { if(e.KeyCode==Keys.Enter) { e.Handled=true; //will not inform any parent controls about the event. e.SuppressKeyPress=true; //do your own logic .... } }; tb.Enter+=(s,e)=> { _oldAcceptButton = AcceptButton; AcceptButton = null; }; tb.Leave+=(s,e)=>{ AcceptButton = _oldAcceptButton; };