【问题标题】:Show button only when focus is on textbox仅当焦点位于文本框时才显示按钮
【发布时间】:2014-09-03 19:14:34
【问题描述】:

仅当焦点在特定文本框上时,是否可以在 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

有没有更好的方法?

【问题讨论】:

  • 尝试在另一个控件中使用 button.visible=false 输入事件而不是在按钮控件中。所以当另一个控件获得焦点时,此按钮可见更改
  • 实际上还有很多其他控件,用户可以专注于其中的任何一个。让每个领域都发生事件并不是很好。
  • 使用 textBox1.GotFocustextBox1.LostFocus
  • @MehdiKhademloo 它的工作原理完全相同。
  • 如果你总是需要点击按钮事件,那么在按钮点击后隐藏按钮。

标签: c# winforms


【解决方案1】:

我认为您只想在焦点位于特定文本框或焦点位于按钮上时才显示按钮

为此,您可以在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,但失败得很惨。你的回答就像一个魅力。谢谢!
【解决方案2】:

为什么不使用 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 没有设置器。 GotFocus/LostFocus 的工作方式与 Enter/Leave 相同 - 单击不会触发。
  • 抱歉,将它与 WPF 属性混淆了。
  • 没有问题。我将此答案标记为有用。我对 WPF 一无所知,但如果 CanFocus 做我认为的事情(如果为真,焦点不会在程序中改变并留在原来的位置),那么我认为它应该可以工作。
  • 关于该编辑:正如我在另一个答案中所说 - 用户也可以忽略该按钮并且不对其执行任何操作,因此可以忽略 button3_Click 事件。
【解决方案3】:

您如何添加一个面板并将按钮和文本框放在该面板中,当用户MouseHovers 时,该面板然后显示按钮...

这样用户就可以点击按钮...

这是您正在寻找的事件,我想... 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;
}

这里是Panel Events的详细信息

【讨论】:

  • 对不起,我不能这样做,因为任务是在文本框焦点/模糊上显示/隐藏按钮。
  • 您可以在文本框的焦点上设置一个标志,然后在面板的悬停事件中使用它
  • 用户通过tab来控制呢?在这种情况下,鼠标可能会完全消失。因此,悬停也不是一种选择。
  • 在这种情况下,您可能需要为面板使用 GotFocusLostFocus 事件
  • 面板无法获得焦点,因为它是一个容器。以下问题中给出的答案具有焦点的实现,但这比延迟按钮隐藏要努力得多。 stackoverflow.com/a/3562449/1745228
【解决方案4】:

您可以在 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. 按钮默认是隐藏的,只有在文本框的 Enter 事件中才会显示按钮。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    相关资源
    最近更新 更多