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

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

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

Ответы [ 3 ]

38 голосов
/ 03 марта 2011

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

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

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

15 голосов
/ 03 мая 2012

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

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

    void MyLoadedRoutedEventHandler(Object sender, RoutedEventArgs e)
    {
        Loaded -= MyLoadedRoutedEventHandler;
        /// ...
    }
};
2 голосов
/ 06 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...