只有文本框聚焦时才显示按钮。

3

当且仅当文本框具有焦点时,是否可以在Windows窗体上显示按钮?

尝试使用以下方法实现:

    private void button3_Click(object sender, EventArgs e)
    {
        MessageBox.Show("OK");
    }

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

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

很遗憾,因为按钮在文本框失去焦点后立即隐藏,导致按钮点击无效,从而阻止了触发button3_Click(/*...*/) { /*...*/ }事件。

现在我是这样做的:

    private void button3_Click(object sender, EventArgs e)
    {
        MessageBox.Show("OK");
    }

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

    private void textBox2_Leave(object sender, EventArgs e)
    {
        //button3.Visible = false;
        DoAfter(() => button3.Visible = false);
    }

    private async void DoAfter(Action action, int seconds = 1)
    {
        await Task.Delay(seconds*1000);
        action();
    }

现在表单等待一秒钟,然后再隐藏 button3

是否有更好的方法?


尝试在另一个控件的Enter事件中使用button.visible=false,而不是在按钮控件中使用。这样,当另一个控件获得焦点时,该按钮的可见性将发生更改。 - Sathish
实际上还有很多其他的控件,用户可以关注其中任何一个。为每个字段创建事件并不是一个好的做法。 - YOhan
使用 textBox1.GotFocustextBox1.LostFocus - a d
@MehdiKhademloo 它的工作方式完全相同。 - YOhan
如果你总是需要点击按钮事件,那么在按钮被点击后隐藏按钮。 - Abdul Ahad
显示剩余3条评论
4个回答

2
我认为您希望仅在文本框处于特定焦点时 或者焦点在按钮上 时才显示该按钮。
要做到这一点,您可以在 textBox2Leave 事件中检查 button3Focused 属性,并只有当按钮没有焦点时才隐藏该按钮。请注意,在 textBox2Leave 事件触发之前,按钮将获得焦点。
然后,您需要在 button3 失去焦点并且焦点移动到除 textBox2 之外的其他地方的情况下隐藏该按钮。您可以使用完全相同的技术,在处理 button3Leave 事件时,只有在 textBox2 没有焦点时才隐藏 button3
以下代码应符合您的要求:
private void textBox2_Leave(object sender, EventArgs e)
{
    if (!button3.Focused)
    {
        button3.Visible = false;
    }
}

private void button3_Leave(object sender, EventArgs e)
{
    if (!textBox2.Focused)
    {
        button3.Visible = false;
    }
}

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

private void button3_Click(object sender, EventArgs e)
{
    MessageBox.Show("Button clicked");
}

你真是太棒了!它在每个其他字段上都能按预期工作,而无需额外的控件或事件。我现在想起来曾尝试过使用 Control.Focused,但失败得很惨。你的答案非常好用。谢谢! - YOhan

1

为什么不使用TextBox的GotFocusLostFocus事件来处理呢?

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

然后在单击事件中隐藏按钮。
private void button3_Click(object sender, EventArgs e)
{
    MessageBox.Show("OK");
    button3.Visible = false;
}

Control.CanFocus没有setter。而GotFocus/LostFocus与Enter/Leave的工作方式相同 - 单击不会触发。 - YOhan
1
抱歉,我把它和 WPF 属性混淆了。 - nickm
没问题。我将把这个答案标记为有用的。我对WPF一无所知,但如果CanFocus做我认为它做的事情(如果是真的,焦点不会在程序中改变,而是保持原样),那么我认为它应该可以工作。 - YOhan
关于那个编辑:正如我在另一个答案中所说 - 用户也可以忽略该按钮并不做任何操作,因此button3_Click事件可以被忽略。 - YOhan

0
你可以添加一个面板,将按钮和文本框放在面板中,当用户 MouseHover 面板时,显示按钮...
这样用户就能够点击按钮了...
我认为这就是你要找的事件... http://msdn.microsoft.com/en-us/library/system.windows.forms.control.mousehover(v=vs.110).aspx 更新:
var textboxFocussed = false;        
private void textBox2_Enter(object sender, EventArgs e)
{
    textboxFocussed = true;
}

private void textBox2_Leave(object sender, EventArgs e)
{
    textboxFocussed = false;
}

更新2

private void Panel_GotFocus(object sender, EventArgs e)
{
    button3.Visible = textboxFocussed;
}

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

这里是面板事件的详细信息


抱歉,我不能这样做,因为任务是在文本框获得/失去焦点时显示/隐藏按钮。 - YOhan
你可以在文本框的焦点上设置一个标志,然后在面板的悬停事件中使用它。 - Naveed Butt
用户使用 Tab 键控制怎么办?在这种情况下,鼠标可能完全不在表单内。因此,悬停也不是一个选项。 - YOhan
在这种情况下,您可能需要使用面板的“GotFocus”和“LostFocus”事件。 - Naveed Butt
面板无法获得焦点,因为它是一个容器。下面问题中给出的答案有关于焦点的实现,但这比延迟按钮隐藏要花费更多的精力。https://dev59.com/xnA65IYBdhLWcg3w7DP8#3562449 - YOhan

0
你可以在Load事件中为窗体上的所有控件添加Enter事件处理程序。只需确保跳过要显示按钮的控件即可。
    List<string> strControlException = new List<string>();

    public Form1()
    {
        InitializeComponent();
        strControlException.Add("btnMain");
        strControlException.Add("txtMain");
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        for (int i = 0; i < this.Controls.Count;i++ )
        {
            if (!strControlException.Contains(Controls[i].Name))
            {
                Controls[i].Enter += new EventHandler(hideButton);
            }
        }
    }

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

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

btnMain(你想要操作的按钮)和txtMain(控制按钮可见性的控件)是这里争议的控件。

在表单上添加更多控件进行测试。

以上代码的解释:

  1. 首先初始化一个列表,其中包含应显示按钮的控件名称。
  2. 在表单加载时,为所有控件(除了我们列表中的控件)添加事件处理程序。
  3. 在处理程序函数中隐藏按钮。(您可能希望根据调用此函数的控件执行更多逻辑)
  4. 按钮默认情况下是隐藏的,只有在文本框进入事件中才会显示按钮。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接