C # WinForms дочерняя форма не перерисовывается после Show () - PullRequest
1 голос
/ 11 января 2011

Я работаю над приложением C # WinForms и хочу, чтобы оно могло открывать немодальное диалоговое окно, которое будет перерисовано и будет интерактивным одновременно с основным окном / формой.

В главном окне используется SerialPort и отображается количество передаваемых данных, которое постоянно увеличивается с помощью SerialDataReceivedEventHandler.

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

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

Возможно, мне следует запустить другой поток или, скорее всего, я просто делаю что-то не так. Я обычно не занимаюсь программированием на C # или Windows (может быть, вы можете сказать.)

Редактировать после комментариев (спасибо, комментаторы):

Я думаю, что, возможно, большинство вещей запускается в любом потоке, под которым вызывается обработчик событий последовательного получения. При запуске моего приложения я создаю класс для обработки серийного номера, который включает в себя:

com.DataReceived += new SerialDataReceivedEventHandler(SerialRxHandler);

Единственный код, который я написал для работы с потоками, - это некоторые функции для обновления счетчиков и списка журналов, которые, как я обнаружил, должны были быть обернуты с помощью InvokeRequired, чтобы я не получал жалоб на переключение потоков:

delegate void SetCountDelegate(TextBox tb, int count);
internal void SetCount(TextBox tb, int count) {
    // thread switch magic
    if (InvokeRequired) {
        BeginInvoke(new SetCountDelegate(SetCount), new object[] { tb, count });
    } else {
        tb.Text = String.Format("{0}", count);
    }
}

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

1 Ответ

0 голосов
/ 11 января 2011

Предположим, я отвечу сам ..

По подсказкам комментаторов и размышлениям я сделал Invoke (), чтобы переключиться на поток пользовательского интерфейса, прежде чем пытаться создать и показать () мой дочерний диалог.Это сработало.

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