Отличные ссылки, Раззи.
Эдвард - вы обнаружите, что самым интересным отличием является то, что Contructor как всегда первый метод, вызываемый в вашем Window / Page / UserControl, и вы не можете рассчитывать на то, что все свойства DependencyProperties были инициализированы до их окончательных значений. Также не рекомендуется вызывать любые виртуальные методы из вашего конструктора.
Напротив, событие Loaded обычно вызывается в конце процессов инициализации ... то есть, когда Window / Page / UserControl полностью загружен в WPF ElementTree. Находясь в загруженном событии, вы можете уверенно вызывать любые методы и изменять любые свойства DepenencyProperty без риска непредвиденных результатов.
Хорошим шаблоном (который я сейчас использую в своем проекте) является инициализация пользовательских свойств зависимостей в событии Loaded , если они не были изменены во время инициализации. Для элементов управления этот шаблон позволяет избежать инициализации «дорогих» свойств (например, DependencyProperty, который представляет собой ObservableCollection), если они перезаписываются (т. Е. Свойством Binding из вызывающего кода).
Простой ответ: используйте событие Loaded, если вы не знаете, как безопасно перегрузить конструктор.