WinForms TopLevel false в беспорядке формы с выбором мыши TextBox - PullRequest
0 голосов
/ 20 июня 2019

Я начал с приложения MDI, но управление окнами не было удобным для пользователя, поэтому я преобразовал все в модель просмотра с вкладками.

Когда я устанавливаю форму с TopLevel = false и делаю ее дочерней по отношению к другомуФорма, все работает правильно, кроме тех случаев, когда вы нажимаете на текст в TextBox, курсор перемещается в начало TextBox вместо того места, где вы щелкнули.Вы не можете нажать на конкретную точку вставки или выбрать диапазон текста.Ввод с клавиатуры не влияет.Вот некоторый простой код для воспроизведения этого:

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        var form1 = new Form();
        var form2 = new Form();
        var tab = new TabControl();
        tab.TabPages.Add("first");
        tab.Dock = DockStyle.Fill;
        form2.TopLevel = false;
        form1.Controls.Add(tab);
        tab.TabPages[0].Controls.Add(form2);
        form2.Controls.Add(new TextBox { Top = 10, Left = 10, Text = "Blah blah blah" });
        form2.Controls.Add(new TextBox { Top = 35, Left = 10, Text = "more text here blah blah" });
        form2.Visible = true;
        Application.Run(form1);
    }
}

Просто запустите этот пример кода и щелкните в середине текста в любом текстовом поле.

Я переопределил WndProc, и это выглядит такформы получают следующие сообщения в указанном порядке при нажатии на другое поле (количество стрелок> для обозначения вложенных вызовов):

> form2.WM_PARENTNOTIFY
> form1.WM_PARENTNOTIFY
> form2.WM_MOUSEACTIVATE
>> form1.WM_MOUSEACTIVATE
> form1.WM_WINDOWPOSCHANGING
> form1.WM_WINDOWPOSITIONCHANGED
> form1.WM_ACTIVATEAPP
> form1.WM_NCACTIVATE
> form1.WM_ACTIVATE

Что еще я пробовал: я выполнил кучу работы по преобразованию дочерних формв UserControls со строками заголовка, кнопками закрытия, изменением размера и перемещением перетаскивания и т. д., но с этим возникали всевозможные проблемы, события неправильно подключались, потому что не было событий FormClosing / FormClosed, настраиваемые элементы управления находили неправильную родительскую форму и т. д.

Таким образом, создание дочерних форм TopLevel = false вместо MdiChild делает именно то, что мне нужно, за исключением одной ошибки.Все остальные элементы управления правильно сфокусированы, взаимодействуя с клавиатурой и мышью, как и ожидалось.Это специфическая проблема с элементом управления WinForms TextBox.

Кто-нибудь знает, как решить проблему фокусировки TextBox, показанную в приведенном выше примере приложения?

1 Ответ

0 голосов
/ 21 июня 2019

Я выполнил целую кучу поиска заранее, но только через день после публикации я обнаружил Windows Forms: невозможно щелкнуть, чтобы сфокусировать MaskedTextBox в форме без верхнего уровня через соответствующую особенность вопросов. Оказывается, этот вопрос в основном дублирует этот вопрос. Ответ Ханса Пассанта на этот вопрос дал мне правильное направление.

Преобразование всех дочерних форм в UserControls не сработало, потому что материал, который ожидал быть размещенным формой, находил форму верхнего уровня вместо дочерних форм. Но ответ Ханса указывает на то, что если вы установите TopLevel = false и FormBorderStyle = None на форме, форма будет в основном действовать как обычный элемент управления. И делая это таким образом, все вещи, которые ожидают форму, на самом деле получат форму.

Таким образом, весь код управления окнами, который я написал для UserControls, оказался полезным (рисование и обработка перетаскиваемых границ, кнопок заголовка, максимизации и закрытия), и все, что мне нужно было сделать, это преобразовать UserControls обратно в формы с TopLevel = false, а затем установите FormBorderStyle = None в OnShown.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...