2016-05-06 5 views
1

У меня есть приложение, которое устанавливает код содержимого основной формы как виды (который является потомком UserControl).Winforms ShowDialog не отображается

Теперь, в одном из моих элементов управления, я хочу показать диалоговое окно сообщения либо при его создании, либо при его показе (т. Е. В конструкторе или методе загрузки).

Жутко, то MessageBox.Show() не показано, как я ожидал ...

Я использую следующий код:

public myControl() { 
    InitializeComponent(); 
    Load += control_load; 
    MessageBox.Show("constructor"); 
} 

void control_load(object sender, EventArgs e) { 
    if (MainForm.Instance.InvokeRequired) { 
     MainForm.Instance.Invoke((Action)delegate { 
     MessageBox.Show("Load invoke"); 
     }); 
     return; 
    } 
    else { 
     MessageBox.Show("Load normal"); 
    } 
    } 
} 

Симптом: InvokeRequired является false. Сообщение «конструктор» не отображается, и у меня есть сообщение «Загрузить нормальное».

Кроме того, если я закомментировать «конструктор» окно сообщения, сообщение не отображается на всех ...

Может кто-нибудь помочь, для моего общего понимания?

ответ

1

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

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

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

По неизвестной причине вы хотите связаться с оператором во время строительства. Я думаю, это для целей отладки. Для этого рассмотрим использование класса Debug.

Если вы действительно хотите сообщить оператору, что элемент управления сконструирован, вы должны подождать, пока не будет построена по крайней мере основная форма.

Кстати, вы загружаете обработчик событий, который может быть вызван только потоком GUI, и поэтому Invoke никогда не потребуется, если вы не делаете странные вещи, например, вызываете функцию напрямую. Таким образом, ваша проверка на InvokeRequired может быть удалена или если вы не доверяете своему собственному коду, вы должны Debug.Assert (! InvokeRequired), чтобы узнать, где вы используете Windows Forms неправильно.

+0

Спасибо, Харальд. Вы правильно относитесь к методу «Конструктор», но это не объясняет, почему сообщение «Загрузить нормальное», которое вызывается в функции «Загрузить» (то есть стандартный способ), показывает только если вызов «MessageBox.Show()» в конструктор сделан ... – neggenbe

+0

где вы видите что-либо о форме, показывающей себя? Просто удалите «MessageBox.Show» из конструктора и часть Invoke кода в методе загрузки - во-первых, ваш вышеприведенный комментарий не имеет значения насколько я могу говорить, во-вторых, 'MessageBox.Show' в методе' control_load' больше не отображается ... – neggenbe

Смежные вопросы