Для вашего первого вопроса,
Хотя это может потребовать некоторой настройки, это позволит вам в достаточной степени установить ширину текстового поля:
Сначала дайте текстовому полю Назовите и прикрепите к этим обработчикам событий. Это необходимо, потому что ширина контекстного меню не определяется до тех пор, пока оно не отобразится.
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);
}
Надеюсь, это поможет.