Загруженное событие пользовательского элемента управления WPF срабатывает более одного раза

Для реализации среды на основе вкладок в WPF нам необходимо преобразовать наши формы в пользовательские элементы управления, однако при этом Loaded Событие пользовательского элемента управления вызывается два раза.

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

4 ответа

Решение

Как объяснено в этом блоге, событие Loaded вызывается, когда элемент управления должен быть визуализирован (т.е. добавлен в визуальное дерево).

Есть несколько элементов управления, которые заставляют ваш элемент управления загружаться / выгружаться несколько раз. Например, нативный WPF TabControl отображает только содержимое выбранной вкладки. Таким образом, при выборе новой вкладки содержимое ранее выбранной вкладки выгружается. Если вы вернетесь к ранее выбранной вкладке, ее содержимое будет перезагружено.

Обходной путь - использовать логическое значение, чтобы указать, инициализировали ли вы свой контроль, как это было предложено другими. Кроме того, вы можете использовать событие Initialized вместо этого.

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

public class MyClass : Window
{
    public MyClass()
    {
        Loaded += MyLoadedRoutedEventHandler;
    }

    void MyLoadedRoutedEventHandler(Object sender, RoutedEventArgs e)
    {
        Loaded -= MyLoadedRoutedEventHandler;
        /// ...
    }
};

Установить loaded флаг в событии, и, если флаг уже установлен, ничего не делать.

Как упоминалось выше, вы можете использовать для этого логический флаг.

Другие вопросы по тегам