Зачем запускать код в методе, вызываемом XAML Window.Loaded? - PullRequest
7 голосов
/ 16 марта 2009

Я видел пример кода, который создает метод Window_Loaded(), который вызывается событием XAML "Window Loaded":

<Window x:Class="TestModuleLoader.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300" Loaded="Window_Loaded">
    <Grid>
        ...
    </Grid>
</Window>

Но в следующем коде код работал как в конструкторе, так и в методе Window_Loaded():

using System.Windows;

namespace TestModuleLoader
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //what advantages do I have running code here? 
        }
    }
}

Есть ли преимущества для этого?

Имеется ли здесь "цикл загрузки окна", как в ASP.NET, который полезно знать, например, такие методы, как PreRender(), PostRender() и т. Д.?

Ответы [ 2 ]

12 голосов
/ 16 марта 2009

Да, для элементов управления WPF существует такой же жизненный цикл, как и в ASP.NET. Однако жизненный цикл элементов управления WPF проще, поскольку он в основном состоит из инициализированного, загруженного и выгруженного события (в этом порядке). См:

http://msdn.microsoft.com/en-us/library/ms754221.aspx

и у Майка Хиллберга есть отличная статья, демонстрирующая разницу между инициализированными и загруженными событиями:

http://blogs.msdn.com/mikehillberg/archive/2006/09/19/LoadedVsInitialized.aspx

3 голосов
/ 16 марта 2009

Отличные ссылки, Раззи.

Эдвард - вы обнаружите, что самым интересным отличием является то, что Contructor как всегда первый метод, вызываемый в вашем Window / Page / UserControl, и вы не можете рассчитывать на то, что все свойства DependencyProperties были инициализированы до их окончательных значений. Также не рекомендуется вызывать любые виртуальные методы из вашего конструктора.

Напротив, событие Loaded обычно вызывается в конце процессов инициализации ... то есть, когда Window / Page / UserControl полностью загружен в WPF ElementTree. Находясь в загруженном событии, вы можете уверенно вызывать любые методы и изменять любые свойства DepenencyProperty без риска непредвиденных результатов.

Хорошим шаблоном (который я сейчас использую в своем проекте) является инициализация пользовательских свойств зависимостей в событии Loaded , если они не были изменены во время инициализации. Для элементов управления этот шаблон позволяет избежать инициализации «дорогих» свойств (например, DependencyProperty, который представляет собой ObservableCollection), если они перезаписываются (т. Е. Свойством Binding из вызывающего кода).

Простой ответ: используйте событие Loaded, если вы не знаете, как безопасно перегрузить конструктор.

...