我有一个带有文本框和列表框的设置,我希望列表框仅在文本框或列表框被聚焦时才可见。首先列表框将是不可见的。然后,当文本框聚焦时,列表框应该是可见的。只有当其中一个失去焦点并且都没有接收到它时,列表框才会再次变得不可见。所以我想要实现的是以下始终是真实的:
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 事件。这是我想到的一种非常简单的方法,但我更喜欢编写一个不监听表单中每个其他控件的控件。
我希望这可以澄清。