C#WinForms ToolStripTextBox大小和检测按键按下

问题描述 投票:0回答:1

我有一个非常简单的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. 我如何要求文本框填充菜单的整个宽度(即与最大的项目一样大)?enter image description here

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

喜欢这个:

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

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

但是现在Alt和Escape要么全部消失,要么全部消失。如何区分它们?

甚至在TextDown和ct1的KeyDown事件上都尝试过,但是Alt键没有转发到那里。

c# winforms toolstripmenu
1个回答
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); 
}

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.