Control.Leave由MouseDown触发,而不是MouseUp

我有一个C#.NET WinForm。在表单中,我允许用户通过双击ListView将项添加到ListView。这会将一个TextBox控件添加到ListView,并将键光标放在TextBox中,以便用户可以键入。 我通过几种方式检测到用户已经完成了某个项目(例如按Enter,Esc,Tab ...),但是当他们离开(TextBox.Leave)TextBox时也是如此。 问题是这一系列步骤: 用户通过鼠标悬停在TextBox外部来触发TextBox.Leave。 我将新项添加到ListView。 我在ListView中选择了新项。 鼠标向上发生,我刚刚选择的新项目失去焦点而未被选中。 我想要的是TextBox.Leave由MouseUp触发,而不是MouseDown。我怎么能做到这一点? 编辑:Cody建议使用ListView.LabelEdit属性。以下是我的结果:
listView_DoubleClick(...) {
  listView.LabelEdit = true;
  if(double clicked on existing listViewItem) {
     listViewItem.BeginEdit();  //this works as expected
  } else {
     var newItem = listView.Items.Add("");
     newItem.BeginEdit();       //this doesn't work, see below  
  }
}
只有当用户双击新项目所在的位置时,对newItem.BeginEdit()的调用才有效。如果他们双击列表视图中的任何其他空白区域,则会添加新项目,但不会进入编辑模式。这里发生了什么?     
已邀请:
在另一个控件上按下鼠标会导致其他控件请求焦点,因此焦点移动会导致TextBox.Leave事件发生。防止其他可能的控制请求焦点不是一个非常可行的选择。但幸运的是,您只需要阻止ListView使用MouseDown来移动焦点。因此,您需要覆盖ListView的WndProc,并且当MouseDown窗口消息出现并且您当前正在显示TextBox时,您会看到该消息。换句话说,您不允许基类处理它。     

要回复问题请先登录注册