【问题标题】:C# WinForms ToolStripTextBox sizing and detect key pressC# WinForms ToolStripTextBox 大小调整和检测按键
【发布时间】:2020-04-29 14:38:39
【问题描述】:

我有一个非常简单的 C# WinForm 示例:

private System.Windows.Forms.ContextMenuStrip ct1;

var header = new ToolStripMenuItem("Header with long test like Lorem Ipsum");
header.Enabled = false;

var txt = new ToolStripTextBox();
txt.Text = "changeme";

ct1.Items.Clear();
ct1.Items.Add(header);
ct1.Items.Add(txt);

ct1.Show(x,y);

现在我有两个问题:

  1. 如何让文本框填满菜单的整个宽度(即与最大项目一样大)?

  2. 如果我按下Alt 键,菜单就会关闭。我可以通过处理Closing 事件来防止它:

像这样:

private void ct1_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
    e.Cancel = (e.CloseReason == ToolStripDropDownCloseReason.Keyboard);
}

但是我希望能够通过按 Escape 来关闭,并且我还希望能够使用 Alt 键作为输入。

但现在 Alt 和 Escape 要么全有,要么全无。如何区分它们?

甚至在 TextBox 和 ct1 的 KeyDown 事件上都进行了尝试,但 Alt 键未转发到那里。

【问题讨论】:

    标签: c# winforms toolstripmenu


    【解决方案1】:

    第一个问题,

    虽然它可能需要一些调整,但这将允许您将文本框的宽度设置到一个好的程度:

    首先,为您的文本框命名并附加到这些事件处理程序。这是必需的,因为上下文菜单的宽度在显示之前是不确定的。

    txt.Name = "changeNameTextBox";
    ct1.Opening += ct1_Opening;
    ct1.Closed += ct1_Closed;
    

    然后实现那些事件处理程序:

    void ct1_Opening(object sender, EventArgs e)
    {
        ToolStripTextBox txt = ct1.Items.Find("changeNameTextBox", false)[0] as ToolStripTextBox;
        txt.Size = new Size(ct1.Width - 50, txt.Height);
    }
    
    void ct1_Closed(object sender, ToolStripDropDownClosedEventArgs e)
    {
        ToolStripTextBox txt = ct1.Items.Find("changeNameTextBox", false)[0] as ToolStripTextBox;
        txt.Size = new Size(0, 25);
    }
    

    至于你的第二个问题,你几乎成功了。

    拥有那个 onClosing 事件,并像这样修改它的主体:

    void ct1_Closing(object sender, ToolStripDropDownClosingEventArgs e)
    {
        e.Cancel =
            e.CloseReason == ToolStripDropDownCloseReason.Keyboard
            && 
            Control.ModifierKeys.HasFlag(Keys.Alt); 
    }
    

    希望这会有所帮助。

    【讨论】:

    • 关于 1:ct1.Width - 50: 50 可以正常工作,但是 50 是从哪里来的?这是某些项目的保证金吗?谢谢
    • 50 只是试错。当我们设置文本框的大小时(.Width 不起作用,只有 .Size 起作用),上下文菜单的大小也会增加。上下文菜单左侧有一个区域用于图标,这部分包含在上下文菜单的宽度中,右侧还有一个我们不能使用的区域(文本框宽度永远不会进入该区域并且上下文菜单宽度反而增加了)。有一些方法可以获取我不知道的图标部分的大小(如 winapi 调用或表单的某些功能)
    • 好的,谢谢,这样很好。关于2:它似乎不起作用,当我按Alt时,菜单立即关闭
    • 还有一件事 2:目标不是阻止 Alt 被按下。目标是能够使用 Alt 输入特殊字符,并让 Escape 关闭菜单。
    • 将设置 lparam 的第 24 位,据此:docs.microsoft.com/en-us/windows/win32/inputdev/wm-keydown
    猜你喜欢
    • 2011-08-14
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多