我相信父进程都是在单个调度程序操作中设置的,因此您应该能够通过将逻辑放入委托中并将其作为设置父进程后的下一个调度程序操作进行排队来获得该行为:
protected override void OnVisualParentChanged(DependencyObject oldParent)
{
base.OnVisualParentChanged(oldParent);
this.Dispatcher.BeginInvoke(new Action(OnReady));
}
private void OnReady()
{
// Element should be fully parented here
}
EndInit
而不是
OnVisualParentChanged
如果你想处理没有父母的情况,尽管
似乎被多次调用,因此您需要检查重复项:
private bool readyQueued;
public override void EndInit()
{
base.EndInit();
if (!readyQueued)
{
this.Dispatcher.BeginInvoke(new Action(OnReady));
readyQueued = true;
}
}
private void OnReady()
{
readyQueued = false;
// Element should be fully parented here
}