我的应用程序目前无法取消选择文本框。唯一的方法是选择另一个文本框。我和我的用户都认为,在表单的任何其他地方单击应该取消选择当前的文本框。我尝试在许多控件上覆盖MouseDown并将焦点设置为随机标签,但对于像MenuStrip或滚动条之类的控件,它不起作用。有什么想法吗?
我的应用程序目前无法取消选择文本框。唯一的方法是选择另一个文本框。我和我的用户都认为,在表单的任何其他地方单击应该取消选择当前的文本框。我尝试在许多控件上覆盖MouseDown并将焦点设置为随机标签,但对于像MenuStrip或滚动条之类的控件,它不起作用。有什么想法吗?
我最近遇到了类似的问题。我的界面非常复杂,有很多面板和选项卡页面,所以我找到的简单答案都不起作用。
我的解决方案是在我的窗体中为每个无法聚焦的控件编写一个鼠标点击处理程序,该处理程序将尝试聚焦表单上的任何标签。当在不同的选项卡页面上时,聚焦特定标签是行不通的,因此我最终通过循环并聚焦所有标签来解决了这个问题。
实现代码如下:
private void HookControl(Control controlToHook)
{
// Add any extra "unfocusable" control types as needed
if (controlToHook.GetType() == typeof(Panel)
|| controlToHook.GetType() == typeof(GroupBox)
|| controlToHook.GetType() == typeof(Label)
|| controlToHook.GetType() == typeof(TableLayoutPanel)
|| controlToHook.GetType() == typeof(FlowLayoutPanel)
|| controlToHook.GetType() == typeof(TabControl)
|| controlToHook.GetType() == typeof(TabPage)
|| controlToHook.GetType() == typeof(PictureBox))
{
controlToHook.MouseClick += AllControlsMouseClick;
}
foreach (Control ctl in controlToHook.Controls)
{
HookControl(ctl);
}
}
void AllControlsMouseClick(object sender, MouseEventArgs e)
{
FocusLabels(this);
}
private void FocusLabels(Control control)
{
if (control.GetType() == typeof(Label))
{
control.Focus();
}
foreach (Control ctl in control.Controls)
{
FocusLabels(ctl);
}
}
HookControl(this);
TextBox
控件上,并给予 Panel
焦点。这个想法是将焦点发送到其他地方,因为您的 TextBox
控件的 Tab Index 目前是最低的,这迫使它在 Form
获得焦点时总是获取焦点。 - user153923由于您可能在Winform上有一个标签或其他控件,我建议使用此处推荐的解决方案,并在单击表单时将焦点放在标签上。
最坏的情况是,您甚至可以添加一个位于-100,-100位置的标签,将其设置为选项卡顺序中的第一个,并在单击表单时将其Focus()。
这是通用答案:为了在用户单击表单的任何其他地方时取消选择文本框,首先使控件失去焦点。为此,请订阅表单的 Click 事件:
private void Form1_Click(object sender, EventArgs e)
{
this.ActiveControl = null;
}
接下来订阅您的文本框到焦点离开事件,并将SelectionLength设置为0(取消选择文本,尽管文本框失去焦点时不显示选择):
private void textBoxes_Leave(object sender, EventArgs e)
{
TextBox txbox = sender as TextBox;
txbox.SelectionLength = 0;
}