1

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

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 事件。这是我想到的一种非常简单的方法,但我更喜欢编写一个不监听表单中每个其他控件的控件。

我希望这可以澄清。

4

2 回答 2

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在自定义控件中公开 from:

public ListBox TheListBox { get { return listBox1; } }

接着:

private void userControl11_Leave(object sender, EventArgs e)
{
  userControl11.TheListBox.Visible = false;
}
于 2012-10-11T08:36:02.693 回答
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;
        }
    }

不要忘记分配控制选项卡索引

于 2012-10-11T08:58:27.900 回答