Winforms - Внедрение формы внутри формы или контейнера заставляет элементы управления формы вести себя по-разному - PullRequest
3 голосов
/ 14 августа 2010

(пересмотрено для качества контента)

Мы создали приложение на основе форм для клиента на основе его требований.В конце проекта они решили, что хотят, чтобы приложение функционировало как часть другого приложения Winforms таким образом, чтобы экраны содержались в больших формах.Они также хотели динамически загружать формы и другие элементы пользовательского интерфейса.Я решил попробовать просто динамически загружать формы внутри другой формы, тогда мне было неудобно переключать все формы на элементы управления.

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

     FormChild form = new FormChild();
     form.TopLevel = false;
     form.Dock = DockStyle.Fill;
     Controls.Clear();
     Controls.Add(form);
     form.Show();

Элементы управления работают, как и ожидалось, когдаЯ обычно показываю форму, используя Show () или ShowDialog (), но не в случае вложенности.

Будучи немного новичком в Winforms из лет MFC, у нас был опыт встраивания форм в элементы управления MFC с использованием FormView без проблем,так предполагалось, что это будет работать нормально с Winforms.Так не получилось.

РЕШЕНИЕ : Я должен был использовать пользовательский элемент управления в первую очередь.Я вручную переделал каждую форму в приложении, создал пустые элементы управления, вырезал и вставил InitializeComponent (), а также логику в пользовательский элемент управления.Что касается динамических компонентов, в настоящее время я создаю их во время выполнения или делаю их в IronPython.Четыре года спустя я оглядываюсь назад на этот вопрос, качая головой из-за ошибки новичка.

Кроме того, я обнаружил, что элементы управления внутри закрепляемых панелей хорошо работают в исходном сценарии, с которым я столкнулся.В частности, я начал использовать DevExpress 'DocumentManager и DockPanel.Моя неопытность в то время с Winforms поставила нас в беду;Я оставил этот вопрос на тот случай, если кто-то совершит ту же ошибку.

Ответы [ 3 ]

3 голосов
/ 14 августа 2010

Можно ли поместить все функции (включая элементы управления) в вашей форме в пользовательский элемент управления? Если вы хотите эту функцию в отдельной форме, перетащите пользовательский элемент управления в пустую форму, если вы хотите, чтобы он был частью существующей формы, перетащите его в это.

Это не решение проблемы, как вы ее представили, но, возможно, это предложение поможет.

1 голос
/ 14 февраля 2013

Короче говоря, то, что вы хотите, возможно, просто посмотрите здесь:

http://social.msdn.microsoft.com/Forums/en/winforms/thread/a5a5ace5-2f88-4ed3-b1e5-ec3500ce1df1

Все дело в импорте SetParent и его использовании.Будут некоторые накладные расходы - вам придется иметь дело с размером и местоположением дочернего местоположения - но в большинстве сценариев не так уж и много.

1 голос
/ 14 августа 2010

Судя по тому, что вы опубликовали, вы хотите динамически загружать некоторые элементы пользовательского интерфейса и показывать их только после завершения загрузки?Я обычно делаю это с помощью `Panel 'или пользовательского элемента управления

[не скомпилированный проверенный код]

Panel p = new Panel();
p.TopLevel = false;
p.Dock = DockStyle.Fill;
p.Controls.Add( button );
// etc
Controls.Clear();
Controls.Add(p);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...