C# Проблема фокуса контекстного меню WinForms при добавлении текстового поля - PullRequest
0 голосов
/ 28 апреля 2020

В C# приложении WinForms мне нужно создать ContextMenuStrip с раскрывающимся списком и текстовым полем:

private System.Windows.Forms.ContextMenuStrip ct1;

private void button_Click(object sender, EventArgs e) 
{
    var header = new ToolStripMenuItem("Header");
    header.Enabled = false;

    var options = new ToolStripMenuItem("Options");

    for (int i = 0; i < 5; i++)
    {
        var checkoption = new ToolStripMenuItem("Check Me " + i + "!");
        checkoption.CheckOnClick = true;
        options.DropDownItems.Add(checkoption);
    }

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


    options.DropDownItems.Add(txt);

    options.DropDown.Closing += DropDown_Closing;

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

    ct1.Show(this, button.Left, button.Top);
}

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

Теперь e.Cancel предотвратит закрытие раскрывающегося списка, если причина ItemClicked, поэтому я могу выбрать больше элементов, не открывая меню снова:

enter image description here

Обратите внимание, что "changeme" - это ToolStripTextBox!

Как только я сфокусируюсь (щелкните на нем), я могу редактировать текст внутри:

enter image description here

После окончания sh редактирования текстового поля, Я все еще могу изменить элементы флажка, но индикатор отсутствует :

enter image description here

Как вернуть индикатор фокусировки как показано на первом снимке?

Примечание: если я наведу указатель мыши на «Верхний колонтитул», раскрывающийся список закроется, а затем переместится обратно в «Параметры», снова откроется раскрывающийся список, а затем индикатор фокуса. снова хорошо:

enter image description here

Как это сделать, не закрывая и не открывая раскрывающийся список?

Я пытался Select() для элемента options, но это не помогло, ни Invalidate() на ct1.

1 Ответ

0 голосов
/ 28 апреля 2020

Просто нашли его:

Сначала нужно добавить обработчик щелчков в раскрывающемся списке:

options.DropDown.Click += DropDown_Click;

Затем в обработчике щелчков необходимо сосредоточиться:

private void DropDown_Click(object sender, EventArgs e)
{
    var dropdown = (ToolStripDropDown)sender;
    dropdown.Focus();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...