Загрузка по сравнению с Показанными событиями в Windows Forms

Неустранимая ошибка: [TraitA] и [TraitB] определяют одно и то же свойство ([$ x]) в композиции [ClassC]

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

Пример:

Проблемное: хотя можно разрешить конфликты между конкурирующими методами , в настоящее время нет синтаксиса, который бы разрешил конфликт между двумя конкурирующими свойствами. Единственное решение в это время - refactor ; т.е. избежать конфликта между именами свойств, которые приводят к фатальной ошибке.


Вопросы, относящиеся:

25
задан Peter Mortensen 9 January 2013 в 16:23
поделиться

6 ответов

Избегайте использования MessageBox. Покажите () для отладки этого. Это качает цикл сообщения, нарушая нормальный поток событий. событие Load инициировано Windows, отправляющим сообщение WM_SHOWWINDOW, непосредственно перед тем, как окно становится видимым. Нет никакого уведомления о Windows для "Вашего окна, теперь полностью показан", таким образом, разработчики WF придумали прием для генерации событие Shown . Они используют Управление. BeginInvoke (), гарантируя OnShown () метод называют, как только программа идет неактивная снова и повторно вводит цикл сообщения.

Этот прием имеет большое другое использование, особенно когда необходимо задержать выполнение кода, запущенного событием. Однако в Вашем случае это разваливается, потому что Вы используете MessageBox. Покажите (). Его цикл сообщения диспетчеризирует делегата, зарегистрированного в BeginInvoke (), заставляя событие Shown работать прежде , окно показывают.

существует много других способов получить диагностику вне MessageBox. Отладка. Печать () и Консоль. WriteLine () удобны, их вывод переходит в Окно вывода Visual Studio , не имея никаких неблагоприятных эффектов на нормальную последовательность увольнения события. Простое точка останова может сделать чудеса также.

53
ответ дан Hans Passant 28 November 2019 в 18:01
поделиться

Shown событие имеет место после Load событие. Основное различие не находится в видимость из формы, а в состояние (ширина, высота, и т.д.).

Для разъяснения вот пример. Рассмотрите форму, которая имеет размер по умолчанию 100, 200 и WindowState, который является Maximized. В Load обработчик событий, размер будет 100, 200. Но в Shown обработчик событий, размер будет Вашим размер экрана .

4
ответ дан DavidRR 28 November 2019 в 18:01
поделиться

Хорошо, я думаю, что разработал то, что действительно продолжается теперь, и куда мой беспорядок прибывал из (хотя не , почему он ведет себя тот путь). Похоже, что событие Shown на самом деле имеет место внутренний событие Load.

, Учитывая этот код:

 protected override OnLoad(EventArgs e)
{
    MessageBox.Show("Enter Load");
    base.OnLoad(e);
    MessageBox.Show("Exit Load");
}

protected override OnShown(EventArgs e)
{
    MessageBox.Show("Enter Shown");
    base.OnShown(e);
    MessageBox.Show("Exit Shown");
}

тогда сообщения показывают в этом порядке:

  1. Входят, Загрузка
  2. Входят Показанный
  3. Выход, Показанный
  4. Загрузка Выхода

, Свойство видимости Верно во всех четырех случаях все же в , ни один из этих случаев не является формой, на самом деле видимой на (нарисованном) экране.

действительно странная вещь, хотя то, что, если я комментирую "Загрузку Выхода" messagebox тогда, форма делает , появляются на экране , прежде чем "Войдут, Показанное" сообщение появляется. Это, кажется, код, выполненный после основного вызова OnLoad, против которого это действительно возражает так или иначе.

2
ответ дан Miral 28 November 2019 в 18:01
поделиться

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

делают быстрый тест с пустым проектом:

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    MsgBox("load") 'form is still visible = false
End Sub

Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    MsgBox("shown") ' form is now visible = true
End Sub
End Class
1
ответ дан Fredou 28 November 2019 в 18:01
поделиться

Я просто проверил и огни загрузки, прежде чем Показали, как это должно.

в Вашем подходе существует, очевидно, что-то не так.

0
ответ дан Cyril Gupta 28 November 2019 в 18:01
поделиться

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

Отслеживаемые события

Форма - Размер клиента изменен: 14.08.2010 10:40:28
Форма - Управление добавлено - button1: 14.08.2010 10:40:29
Форма - Конструктор: 14.08.2010 10:40:29
Форма - дескриптор создан: 14.08.2010 10:40:29
Форма - недействительна: 14.08.2010 10:40:29
Форма - событие загрузки формы: 14.08.2010 10:40:29
Форма - загружена: 14.08.2010 10:40:29
Форма - Создание элемента управления: 14.08.2010 10:40:29
Форма - Активирована: 14.08.2010 10:40:29
Форма - Показано: 14.08.2010 10:40:29
Форма - OnPaint: 14.08.2010 10:40:29
Форма - недействительна: 14.08.2010 10:40:29
Форма - OnPaint: 14.08.2010 10:40:29

15
ответ дан 28 November 2019 в 18:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: