Добавление и удаление пользовательского элемента управления из визуального дерева вызывает событие Unloaded, но не событие Loaded. - PullRequest
1 голос
/ 21 апреля 2019

Я заметил, что если пользовательский элемент управления (или, может быть, какой-либо элемент Framework) сразу добавляется и удаляется из визуального дерева, событие Loaded никогда не вызывается, но всегда возникает событие Unloaded.

Воспроизвестипроблема, создайте пустой проект UWP, добавьте следующий XAML и код в MainPage:

<Page ...>
    <Grid>
      <StackPanel>
         <Button Click="Button_Click" Content="Click Me"/>
         <Border x:Name="border"/>
      </StackPanel>
    </Grid>
</Page>

Код сзади:

public MainPage() {
     this.InitializeComponent();
     this.control = new UserControl();
     this.control.Loaded += OnLoaded;
     this.control.Unloaded += OnUnloaded;
  }
  private void Button_Click(object sender, RoutedEventArgs e) {
     this.border.Child = this.control;
     this.border.Child = null;
  }
  private void OnLoaded(object sender, RoutedEventArgs e) {
     System.Diagnostics.Debug.WriteLine("Loaded.");
  }
  private void OnUnloaded(object sender, RoutedEventArgs e) {
     System.Diagnostics.Debug.WriteLine("Unloaded");
  }

Несколько раз нажав на кнопку, вы получите следующеевывод:

Unloaded
Unloaded
Unloaded
Unloaded
Unloaded
Unloaded
Unloaded

FrameworkEvent.Loaded (MSDN):

Происходит, когда FrameworkElement был создан и добавлен в дерево объектов и готовдля взаимодействия

FrameworkEvent.Unloaded (MSDN):

Происходит, когда этот объект больше не подключен к дереву основного объекта.

Что именно здесь происходит?Если элемент управления не добавлен в визуальное дерево, потому что он немедленно удаляется, почему вызывается метод Unloaded?Есть ли документация для этого поведения?

1 Ответ

0 голосов
/ 22 апреля 2019

Это на самом деле не вопрос программирования, а скорее критика семантики, используемой разработчиками в Microsoft.Я отвечу на это аналогией.Я бы прокомментировал это, но это слишком долго.

Загрузка багажа в самолете идет медленно.Я должен сделать одну сумку за раз.Разгрузка происходит мгновенно, я нажимаю на рычаг, и все они выпадают.

Как только я начинаю загружать первый предмет багажа в самолет, я выкрикиваю: «Погрузка!»(событие «Загрузка»).

Когда я заканчиваю загружать весь багаж, я выкрикиваю «Загружен».(событие «Loaded»).

Если мне позвонят и сообщат, что рейс отменен, я нажимаю на рычаг и убираю багаж, который уже положил, и выкрикиваю «Unloaded» (событие «Unloaded»).).Независимо от того, действительно ли я закончил загружать весь багаж в первую очередь или нет, это не имеет значения.Я выгрузил его после того, как уже начал загрузку.

Итак, семантически, вы видите, как можно выгрузить то, что еще не было загружено.Представьте, что событие «Loaded» означает «полностью загружен», а событие «Loading» означает «частично загружен».Какую бы реальную проблему ни вызывало это поведение, обращайтесь к событию «Загрузка» вместо события «Загрузка».

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