C# WinForms ToolStripTextBox 调整大小和检测按键
C# WinForms ToolStripTextBox sizing and detect key press
我有一个非常简单的 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);
现在我有两个问题:
如何让文本框填满菜单的整个宽度(即与最大的项目一样大)?
如果我按 Alt
键,菜单会关闭。我可以通过处理 Closing
事件来阻止它:
像这样:
private void ct1_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
e.Cancel = (e.CloseReason == ToolStripDropDownCloseReason.Keyboard);
}
但是我希望能够通过按 Escape 关闭,并且我还希望能够使用 Alt 键作为输入。
但现在 Alt 和 Escape 要么全有要么全无。我如何区分它们?
甚至在 TextBox 和 ct1
的 KeyDown 事件上都尝试过,但 Alt 键没有转发到那里。
对于你的第一个问题,
虽然可能需要进行一些调整,但这将允许您将文本框的宽度设置到一个很好的程度:
首先,为您的文本框命名并附加到这些事件处理程序。这是必需的,因为上下文菜单的宽度在显示之前是不确定的。
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);
}
希望对您有所帮助。
我有一个非常简单的 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);
现在我有两个问题:
如何让文本框填满菜单的整个宽度(即与最大的项目一样大)?
如果我按
Alt
键,菜单会关闭。我可以通过处理Closing
事件来阻止它:
像这样:
private void ct1_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
e.Cancel = (e.CloseReason == ToolStripDropDownCloseReason.Keyboard);
}
但是我希望能够通过按 Escape 关闭,并且我还希望能够使用 Alt 键作为输入。
但现在 Alt 和 Escape 要么全有要么全无。我如何区分它们?
甚至在 TextBox 和 ct1
的 KeyDown 事件上都尝试过,但 Alt 键没有转发到那里。
对于你的第一个问题,
虽然可能需要进行一些调整,但这将允许您将文本框的宽度设置到一个很好的程度:
首先,为您的文本框命名并附加到这些事件处理程序。这是必需的,因为上下文菜单的宽度在显示之前是不确定的。
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);
}
希望对您有所帮助。