如何在 KeyPress 上正确关闭 TextBox 菜单项

How to close TextBox Menu Item properly on KeyPress

我正在使用径向仪表显示温度。用户应该能够重命名每个仪表,双击名称是不可能的,所以我必须制作一个菜单,用户可以在其中更改仪表的名称。

我通过为每个仪表创建一个菜单项来解决这个问题。因此,当您单击菜单项时,例如 "Thermometer 1",将出现类型为 ToolStripTextBox 的子菜单,其中包含 TextBox 中的相同文本。在 TextBox 中,用户可以更改名称。我希望当用户在 TextBox 中按 Enter 时,文本框菜单项关闭,但父菜单项 "Theremometer1" 保持打开状态。 (Thermometer1,Thermometer2,...关闭文本框菜单项后不应消失。)

这是我用来关闭 TextBox 菜单的代码:

private void thermometer1ToolStripMenuItem1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == '\r')
    {
        thermometer1ToolStripMenuItem1.Visible = false;
    }
}

但是如您所见,小白条仍然可见。有人可以帮我吗?

如何在用户按 Enter 时正确关闭 ToolStripTextBox 菜单项?那个小白条不应该保持可见。

我想您需要删除 sub-item 并且不使其可见或不可见。 我相信您的问题与 Thermometer1 的 "invisible" child 有关。 尝试删除 child 项。

关闭下拉菜单的正确方法

项目的设置Visible不是您所需要的。当你想关闭一个菜单项时,找到它的所有者 ToolStripDropDown 并调用它的 Close 方法就足够了:

private void someToolStripMenuItem_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Enter)
    {
        var item = (ToolStripItem)sender;
        var owner = (ToolStripDropDown)(item.Owner);
        owner.Close();
    }
}

这样你就不会遇到那个小白条问题,因为你关闭了下拉菜单。但是,当您将项目的可见性设置为 false 而不是关闭下拉菜单时,下拉菜单仍处于打开状态,不包含任何元素,因此它显示为小白条。

什么是小酒吧问题?

您看到的小白条是一个打开的ToolStripDropDown,不包含上述项目。

只有当您在下拉列表打开的情况下删除所有项目时才会发生这种情况;在这种情况下,下拉列表保持打开状态,不包含任何项目。一旦您关闭下拉菜单,它就会消失并且不会通过指向其父级出现。

如果您将关闭的下拉列表的所有项目设置为不可见,则下拉列表将不会通过指向其父项来显示。打开的下拉菜单也需要此行为,该问题需要解决方法。

您可以检查您设为不可见的物品的所有者是否不包含其他可见物品,然后将其也设为不可见。该项目的所有者是保持打开状态的下拉菜单。

private void someToolStripMenuItem_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Enter)
    {
        var item = (ToolStripItem)sender;
        item.Visible = false;
        var owner = (ToolStrip)(item.Owner);
        owner.Visible = owner.Items.Cast<ToolStripItem>().Any(x => x.Visible);
    }
}