检测哪个控件处于活动状态

时间:2012-10-11 08:23:29

标签: c# .net textbox listbox focus

我有一个文本框和列表框的设置,我希望列表框只有在文本框或列表框聚焦时才可见。首先,列表框将不可见。然后,当文本框被聚焦时,列表框应该是可见的。只有当失去焦点并且两者都没有接收它时,列表框才会再次变得不可见。所以我想要达到的目标始终如下:

listBox.Visible = textBox.Focused || listBox.Focused

在我的解决方案中,文本框和/或列表框可以是标准类型的特化(如果这简化了解决方案)。

我尝试过监听LostFocus和GotFocus事件,并设置列表框的可见性。但是,从不在列表框上调用GotFocus事件,因为当文本框失去焦点时,我将其变为不可见。

有没有人有关于如何实现这一目标的建议?我的备份计划(我不喜欢)是在一个人失去焦点时启动计时器,如果另一个人获得焦点则停止计时器。因此,非常感谢“更清洁”的实现方式;)

编辑:我正在开发它以用作.NET WinForms自定义控件。

编辑2:

似乎我没有足够好地解释自己。因此,我将尝试更明确地解释我想要实现的目标。

我正在创建一种新类型的TextBox(继承几年前构建的现有类型的TextBox)。 TextBox当前用作对象的通用集合(包括实现IList的子类型)。 TextBox定义了一个ListBox,它根据一组条件显示集合中元素的子集。当TextBox添加到父控件时,ListBox也是如此。因此,这两个工作作为搜索元素集合的设置。与您开始输入时浏览器提出建议的内容相同。

我使用此设置而不是包含两个控件的UserControl,因为后者会导致usercontrol是两个控件的大小,或者(当大小与TextBox匹配时)ListBox不可见。

我意识到我可以选择在添加此控件的表单中的所有控件上处理GotFocus或Enter事件。这是一个我想到的非常简单的方法,但我更喜欢编写一个不会监听表单中每个控件的控件。

我希望这可以澄清。

2 个答案:

答案 0 :(得分:0)

您可以做的是向表单上的所有其他控件添加Enter事件处理程序。

private void OtherControls_Enter(object sender, EventArgs e)
{
  listBox.Visible = false;
}

修改
示例适用于WinForms,但也适用于WPF。

如果自定义控件仅包含TextBoxListBox,那么您可以向TextBox添加一个事件,以便将ListBox设置为可见:

private void textBox1_Enter(object sender, EventArgs e)
{
  listBox1.Visible = true;
}

如果有其他控件,则向其添加OtherControls_Enter事件处理程序。

在自定义控件的Leave事件中,您可以添加以下内容:

private void userControl11_Leave(object sender, EventArgs e)
{
  userControl11.Controls["listbox1"].Visible = false;
}

编辑2:
更好的方法是在自定义控件中公开ListBox

public ListBox TheListBox { get { return listBox1; } }

然后:

private void userControl11_Leave(object sender, EventArgs e)
{
  userControl11.TheListBox.Visible = false;
}

答案 1 :(得分:0)

将所有控件Control_Enter事件实现为集中式,并检查发件人对象是否是您的文本框或列表框,然后列表框将显示为其他不可见。

喜欢这个

this.button1.Enter += new System.EventHandler(this.Control_Enter);
   this.textBox1.Enter += new System.EventHandler(this.Control_Enter);
   this.listBox1.Enter += new System.EventHandler(this.Control_Enter);

private void Control_Enter(object sender, EventArgs e)
    {
        Control obj = (Control)sender;
        if (obj.Name == "textBox1" || obj.Name == "listBox1")
        {
            listBox1.Visible = true;
        }
        else
        {
            listBox1.Visible = false;
        }
    }

别忘了分配控制标签索引