【发布时间】:2009-02-19 21:20:47
【问题描述】:
我正在监听页面的加载事件。该事件首先触发,然后所有的孩子触发他们的加载事件。我需要一个在所有孩子都加载后触发的事件。存在吗?
【问题讨论】:
我正在监听页面的加载事件。该事件首先触发,然后所有的孩子触发他们的加载事件。我需要一个在所有孩子都加载后触发的事件。存在吗?
【问题讨论】:
我听到了。为此,我还缺少 WPF 中的开箱即用解决方案。
有时您希望在加载所有子控件后执行一些代码。
把this放在父控件的构造函数中
Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() => {code that should be executed after all children are loaded} ));
到目前为止帮了我几次。
【讨论】:
Loaded 是在所有孩子都成为Initialized 之后触发的事件。据我所知,没有AfterLoad 事件。如果可以的话,将孩子的逻辑移到Initialized事件中,然后Loaded会在它们全部初始化后发生。
【讨论】:
您也可以使用事件:ContentRendered。
http://msdn.microsoft.com/en-us/library/ms748948.aspx#Window_Lifetime_Events
【讨论】:
WPF 无法提供这种事件,因为大多数时候 Data 决定是否将特定子项加载到 VisualTree(例如 DataTemplate 中的 UI 元素)
因此,如果您能更清楚地解释您的场景,我们就能找到特定的解决方案。
【讨论】:
我遇到了同样的问题。 @configurator 是对的,如果您遇到此问题,那么我相信这是因为您的子元素有问题。在我的情况下,自定义用户控件所在的子元素。我错误地初始化了它们。我修复了用户控件,一切正常
【讨论】:
其中一个选项(呈现内容时):
this.LayoutUpdated += OnLayoutUpdated;
private void OnLayoutUpdated(object sender, EventArgs e)
{
if (!isInitialized && this.ActualWidth != 0 && this.ActualHeight != 0)
{
isInitialized = true;
// Logic here
}
};
【讨论】:
我最终按照这些思路做了一些事情.. 你的里程可能会有所不同。
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)();
}
【讨论】: