Загруженное событие пользовательского элемента управления 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
флаг в событии, и, если флаг уже установлен, ничего не делать.
Как упоминалось выше, вы можете использовать для этого логический флаг.