Подтвердить что ты не робот

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

Чтобы реализовать среду с вкладками в WPF, нам нужно преобразовать нашу форму WPF в пользовательский элемент управления, чтобы выполнить среду на основе табуляции, однако при этом loaded event пользовательского элемента управления называется two times.

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

Спасибо

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

На самом деле, уже есть свойство IsLoaded, поэтому вы можете добавить эту строку в начало обработчика обработанных событий:

If Me.IsLoaded Then Return