在WPF中是否有“所有儿童装载”活动

时间:2009-02-19 21:20:48

标签: c# .net wpf

我正在侦听Page的加载事件。该事件首先触发,然后所有孩子发起他们的负载事件。我需要一个在所有孩子都已加载时触发的事件。那存在吗?

7 个答案:

答案 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将在初始化完成后发生。

请参阅MSDN - Object Lifetime Events

答案 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)();
}