如何自动打开一个聚焦框?

时间:2018-10-17 13:05:56

标签: c# winforms combobox dropdown

我有一个Windows Forms表单,其中包含多个组合框。

我希望其中的一个组合框可以在键盘和鼠标都获得焦点时打开元素列表。

DroppedDown类的ComboBox属性管理元素列表的可见性。

最适合我需要的事件是Enter,所以我写的代码是:

private void comboBox1_Enter(object sender, EventArgs e)
{
    this.comboBox1.DroppedDown = true;
}

它可以工作,但是当直接单击组合框右侧没有焦点的图标时,元素列表将打开,并且在打开后突然消失。

我尝试了多种方法来修复此奇怪的行为,检查Focused属性或使用其他事件,例如DropDownMouseClick,而没有得到任何可接受的结果。

animation of the problem

3 个答案:

答案 0 :(得分:2)

一种简单的方法(不会强制您覆盖派生的ComboBox的控件WndProc)是模拟 HitTest ,测试 MouseDown < / em>出现在ComboBox按钮区域上;然后,仅在未设置DroppedDown = true;的情况下设置。

因此,当在“按钮”上单击鼠标时,不会以意外的方式(对于“控件”)移动“焦点”,从而不会产生双重效果。

private void comboBox1_Enter(object sender, EventArgs e)
{
    ComboBox combo = sender as ComboBox;
    if (!combo.DroppedDown)
    {
        if (combo.PointToClient(Cursor.Position).X < 
            combo.ClientRectangle.Width - SystemInformation.VerticalScrollBarWidth)
        {
            combo.DroppedDown = true;
            Cursor = Cursors.Arrow;
        }
    }
}

答案 1 :(得分:0)

在表单构造函数上使用以下代码:

this.comboBox1.GotFocus += (sender,args) => comboBox1.DroppedDown = true;

答案 2 :(得分:0)

创建一个从ComboBox继承的新类:

public class Combo : ComboBox
{
     protected override void OnClick(EventArgs e)
     {
         if (!DroppedDown) base.OnClick(e);
     }           
}

并在其点击调用base.OnClick(e);中(如果未下拉)。 使用这个而不是组合框。 (如果单击,则基本单击事件将被忽略)