Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有一个“问题”;“所有儿童均已加载”;WPF中的事件_C#_.net_Wpf - Fatal编程技术网

C# 是否有一个“问题”;“所有儿童均已加载”;WPF中的事件

C# 是否有一个“问题”;“所有儿童均已加载”;WPF中的事件,c#,.net,wpf,C#,.net,Wpf,我正在侦听页面的已加载事件。该事件首先激发,然后所有子事件激发其加载事件。我需要一个事件,当所有的孩子都加载后激发。是否存在?已加载是在初始化所有子项后激发的事件。据我所知,没有AfterLoad事件。如果可以,将子逻辑移动到Initialized事件,然后在所有子逻辑都初始化后将发生Loaded 请参阅。WPF无法提供此类事件,因为大多数时间数据都在确定是否将特定子级加载到VisualTree(例如数据模板中的UI元素) 因此,如果您能更清楚地解释一下您的场景,我们可以找到一个特定于此的解决方

我正在侦听页面的已加载事件。该事件首先激发,然后所有子事件激发其加载事件。我需要一个事件,当所有的孩子都加载后激发。是否存在?

已加载
是在初始化所有子项后激发的事件。据我所知,没有
AfterLoad
事件。如果可以,将子逻辑移动到
Initialized
事件,然后在所有子逻辑都初始化后将发生
Loaded


请参阅。

WPF无法提供此类事件,因为大多数时间数据都在确定是否将特定子级加载到VisualTree(例如数据模板中的UI元素)


因此,如果您能更清楚地解释一下您的场景,我们可以找到一个特定于此的解决方案。

我最终按照这些思路做了一些事情。。你的国籍可能不同

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

我也有同样的问题@configurator是正确的,如果您有这个问题,那么我相信这是因为您的子元素有问题。在我的例子中,子元素包含一个自定义用户控件。我错误地初始化了它们。我修复了用户控件,一切都很好

您还可以使用event:ContentRendered


我听到了。我还缺少WPF中的开箱即用解决方案

有时,您希望在加载所有子控件后执行一些代码

将其放入父控件的构造函数中

Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() => {code that should be executed after all children are loaded} ));
到目前为止,曾帮助过我几次。

选项之一(内容呈现时):

this.LayoutUpdated+=OnLayoutUpdated

private void OnLayoutUpdated(object sender, EventArgs e)
            {
                if (!isInitialized && this.ActualWidth != 0 && this.ActualHeight != 0)
                {
                    isInitialized = true;
                    // Logic here
                }
            };

如果一个答案不正确,怎么可能有7票?Buckly的答案只有两张赞成票,效果很好。@FrederikPrijck仅仅因为一个答案正确并不意味着另一个答案不正确。这个答案是正确的、有用的,并且正是我所需要的——我在孩子的加载处理程序中做了一些事情,而不是在它的初始化处理程序中应该做的事情。事实上,Buckley的答案是“在WPF中缺少一个现成的解决方案”,这与这个答案是一致的。看看Jobi的答案,这表明在某些情况下Buckey的破解是不够的。我在哪里说只有一个答案是正确的?这个答案对我来说不起作用,但这完全不同于只留下一个答案是正确的。但是已经有一段时间了,所以我不知道细节。@FrederikPrijck,因为你和投你票的5个人是不正确的?如果父对象需要获得子对象的精确渲染大小,则此操作不起作用。此操作非常有效。谢谢