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

Есть ли событие "Все дети загружены" в WPF

Я слушаю загруженное событие страницы. Это событие срабатывает первым, а затем все дети запускают свое событие нагрузки. Мне нужно событие, которое срабатывает, когда ВСЕ дети загрузились. Это существует?

4b9b3361

Ответ 1

Я тебя слышу. Я также пропустил из WPF решение для этого.

Иногда вы хотите, чтобы какой-то код выполнялся после загрузки всех дочерних элементов управления.

Поместите это в конструктор родительского элемента управления

Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() => {code that should be executed after all children are loaded} ));

Помог мне несколько раз до сих пор.

Ответ 2

Loaded - событие, которое срабатывает после того, как все дети были Initialized. Насколько мне известно, событие AfterLoad отсутствует. Если вы можете, переместите дочернюю логику в событие Initialized, а затем Loaded произойдет после того, как все они были инициализированы.

См. MSDN - События жизненного цикла объекта.

Ответ 4

WPF не может обеспечить такое событие, поскольку большую часть времени данные определяют, когда нужно загружать определенный ребенок в VisualTree или нет (например, элементы пользовательского интерфейса внутри DataTemplate)

Итак, если вы можете более подробно объяснить свой сценарий, мы сможем найти решение, соответствующее этому.

Ответ 5

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

Ответ 6

Один из вариантов (при отображении содержимого):

this.LayoutUpdated + = OnLayoutUpdated;

private void OnLayoutUpdated(object sender, EventArgs e)
            {
                if (!isInitialized && this.ActualWidth != 0 && this.ActualHeight != 0)
                {
                    isInitialized = true;
                    // Logic here
                }
            };

Ответ 7

Я закончил тем, что делал что-то в этом направлении.

void WaitForTheKids(Action OnLoaded)
{
  // After your children have been added just wait for the Loaded
  // event to fire for all of them, then call the OnLoaded delegate

  foreach (ContentControl child in Canvas.Children)
  {
    child.Tag = OnLoaded; // Called after children have loaded
    child.Loaded += new RoutedEventHandler(child_Loaded);
  }
}
internal void child_Loaded(object sender, RoutedEventArgs e)
{
  var cc = sender as ContentControl;
  cc.Loaded -= new RoutedEventHandler(child_Loaded);

  foreach (ContentControl ctl in Canvas.Children)
  {
    if (!ctl.IsLoaded)
    {
      return;
    }
  }
  ((Action)cc.Tag)();
}