WPF控件加载的事件在创建子级之前激发

WPF控件加载的事件在创建子级之前激发,wpf,Wpf,我有一个用于控件“已加载”事件的事件处理程序,在该事件中,我更改了其中一个可视子级的属性。多年来,这对我来说效果不错;我的处理程序得到它需要的子类型,改变填充,一切都很好 但是现在我已经开始在TabControl的页面上使用这个控件。这个页面是我一次创建的几个页面中的一个,它最初并没有显示出来。对于此页面,加载的事件在用户激活该页面之前激发。但当调用我加载的处理程序时,实际上没有可视子对象。VisualTreeHelper报告子级的计数为0 但稍后,当单击选项卡并使页面可见时,我可以看到该控件及

我有一个用于控件“已加载”事件的事件处理程序,在该事件中,我更改了其中一个可视子级的属性。多年来,这对我来说效果不错;我的处理程序得到它需要的子类型,改变填充,一切都很好

但是现在我已经开始在TabControl的页面上使用这个控件。这个页面是我一次创建的几个页面中的一个,它最初并没有显示出来。对于此页面,加载的事件在用户激活该页面之前激发。但当调用我加载的处理程序时,实际上没有可视子对象。VisualTreeHelper报告子级的计数为0

但稍后,当单击选项卡并使页面可见时,我可以看到该控件及其所有子控件都已创建。显然,它们是在加载的事件被触发后创建的

是否有其他事件可以挂接以确保控件的子项已创建

这是我使用的XAML

<tk:RadColorPicker 
    Margin="5,0"
    SelectedColor="{Binding Settings.LiveImageHighlightColor, Mode=TwoWay}" 
    Loaded="RadColorPicker_OnLoaded"/>

我已经阅读了微软关于这方面的指南和一些相关的帖子。它们都指向“已加载”,因为我希望加载的事件是UI元素准备好交互时发生的,但这并不意味着子元素准备好了。我怀疑这是你正在关注的事件for@Demon-我不认为这是对的-我想你说的是初始化的事件,加载的事件在所有子项初始化之后和渲染之前激发。在第一次渲染发生时,数据绑定已经有机会运行。已加载的事件在树构建和初始化后激发,数据绑定已运行并连接到渲染表面,但尚未渲染-这就是它激发的时间。请参见@Demon另请参见
TabControl
的行为可能与您预期的不同。通常可能会多次调用加载的事件,这对于TabControl是正确的,尤其是在切换选项卡时。您确定不会再次调用该事件吗?您也可以监听TabControl的已加载事件,该事件应在每个内容开关上引发。或者,另一种解决方案可以是侦听控件的LayoutUpdated事件。它在布局过程中多次出现(包括向元素树添加和删除子元素),因此您需要筛选此事件。感谢您的建议。我确实在处理程序中设置了一个断点来确保,但不幸的是,没有再次调用它。布局更新听起来是有可能的。我不确定如何过滤掉冗余,因为这也是我在一个样式的事件设置程序中所做的。(可能使用“Tag”属性来记住我是否做了更改)
private void RadColorPicker_OnLoaded(object sender, RoutedEventArgs e)
{
    if (!(sender is RadColorPicker rcp))
        return;

    var count = VisualTreeHelper.GetChildrenCount(rcp);

    // Other code here where I get the child of the type I want and change its padding
    // But it's irrelevant to this question because the count = 0 in the error case
}