Я слушаю загруженное событие страницы. Это событие срабатывает первым, а затем все дети запускают свое событие нагрузки. Мне нужно событие, которое срабатывает, когда ВСЕ дети загрузились. Это существует?
Есть ли событие "Все дети загружены" в WPF
Ответ 1
Я тебя слышу. Я также пропустил из WPF решение для этого.
Иногда вы хотите, чтобы какой-то код выполнялся после загрузки всех дочерних элементов управления.
Поместите это в конструктор родительского элемента управления
Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() => {code that should be executed after all children are loaded} ));
Помог мне несколько раз до сих пор.
Ответ 2
Loaded
- событие, которое срабатывает после того, как все дети были Initialized
. Насколько мне известно, событие AfterLoad
отсутствует. Если вы можете, переместите дочернюю логику в событие Initialized
, а затем Loaded
произойдет после того, как все они были инициализированы.
Ответ 3
Вы также можете использовать событие: ContentRendered.
http://msdn.microsoft.com/en-us/library/ms748948.aspx#Window_Lifetime_Events
Ответ 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)();
}