我正在侦听Page的加载事件。该事件首先触发,然后所有孩子发起他们的负载事件。我需要一个在所有孩子都已加载时触发的事件。那存在吗?
答案 0 :(得分:46)
我听到了你的声音。我也错过了WPF中的开箱即用解决方案。
有时您希望在加载所有子控件后执行一些代码。
将它放在父控件的构造函数中
Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() => {code that should be executed after all children are loaded} ));
到现在为止帮了我几次。
答案 1 :(得分:12)
Loaded
是所有儿童Initialized
后发生的事件。据我所知,没有AfterLoad
事件。如果可以,请将子项的逻辑移至Initialized
事件,然后Loaded
将在初始化完成后发生。
答案 2 :(得分:3)
您还可以使用该事件:ContentRendered。
http://msdn.microsoft.com/en-us/library/ms748948.aspx#Window_Lifetime_Events
答案 3 :(得分:0)
WPF无法提供这种事件,因为大部分时间Data都在确定是否要将特定子项加载到VisualTree(例如DataTemplate中的UI元素)
因此,如果您能够更清楚地解释您的情景,我们可以找到特定于此的解决方案。
答案 4 :(得分:0)
我遇到了同样的问题。 @configurator是对的,如果你有这个问题,那么我相信这是因为你的孩子元素有问题。在我的情况下,自定义用户控件的子元素。我错误地初始化它们。我修复了用户控件,一切都运行良好
答案 5 :(得分:0)
其中一个选项(呈现内容时):
this.LayoutUpdated + = OnLayoutUpdated;
private void OnLayoutUpdated(object sender, EventArgs e)
{
if (!isInitialized && this.ActualWidth != 0 && this.ActualHeight != 0)
{
isInitialized = true;
// Logic here
}
};
答案 6 :(得分:-2)
我最终在这些方面做了一些事情......你的里程可能会有所不同。
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)();
}