Есть ли в WPF событие «Все дети загружены»? - PullRequest
31 голосов
/ 20 февраля 2009

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

Ответы [ 7 ]

46 голосов
/ 04 августа 2013

Я вас слышу. Для этого мне также не хватает готового решения в WPF.

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

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

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

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

12 голосов
/ 20 февраля 2009

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

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

3 голосов
/ 31 августа 2012

Вы также можете использовать событие: ContentRendered.

http://msdn.microsoft.com/en-us/library/ms748948.aspx#Window_Lifetime_Events

0 голосов
/ 18 февраля 2016

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

this.LayoutUpdated + = OnLayoutUpdated;

private void OnLayoutUpdated(object sender, EventArgs e)
            {
                if (!isInitialized && this.ActualWidth != 0 && this.ActualHeight != 0)
                {
                    isInitialized = true;
                    // Logic here
                }
            };
0 голосов
/ 22 марта 2012

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

0 голосов
/ 20 мая 2010

Я закончил тем, что делал что-то в этом роде ... Ваш мигал может отличаться.

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)();
}
0 голосов
/ 20 февраля 2009

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

Так что, если вы сможете объяснить ваш сценарий немного яснее, мы сможем найти решение, специфичное для этого.

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