C# WinForms ToolStripTextBox определение размера и определение нажатия клавиши - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть очень простой 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 - это все или ничего. Как я могу различить их?

Пробовал даже на событии KeyDown для TextBox, а также для ct1, но клавиша Alt туда не перенаправляется.

1 Ответ

1 голос
/ 29 апреля 2020

Для вашего первого вопроса,

Хотя это может потребовать некоторой настройки, это позволит вам в достаточной степени установить ширину текстового поля:

Сначала дайте текстовому полю Назовите и прикрепите к этим обработчикам событий. Это необходимо, потому что ширина контекстного меню не определяется до тех пор, пока оно не отобразится.

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); 
}

Надеюсь, это поможет.

...