Я начал с приложения 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, показанную в приведенном выше примере приложения?