C# 在更改父项后立即调用TransformToVisual将不起作用

C# 在更改父项后立即调用TransformToVisual将不起作用,c#,wpf,xaml,C#,Wpf,Xaml,我使用TransformToVisual获取控件相对于其父控件的位置。在将此控件添加到StackPanel之后,我需要这个位置,但是,我得到的结果是0,0转换 如果将此方法与任务延迟一毫秒,则效果良好 我不理解这种行为,因为我没有做任何线程。有没有人能在没有任务的情况下解决这个问题 以下是缩短的代码: public readonly Point position; public Container(Box box) { InitializeComponent(); //Sta

我使用TransformToVisual获取控件相对于其父控件的位置。在将此控件添加到StackPanel之后,我需要这个位置,但是,我得到的结果是0,0转换

如果将此方法与任务延迟一毫秒,则效果良好

我不理解这种行为,因为我没有做任何线程。有没有人能在没有任务的情况下解决这个问题

以下是缩短的代码:

public readonly Point position;

public Container(Box box) {
    InitializeComponent();

    //StackPanel with custom margins and centered alignment
    stackPanel.Children.Add(box);

    position = this.TransformToVisual(box).Transform(new Point(0, 0))
}

当您在那里添加子控件时,控件位于子控件中,度量和安排机制用于确定它应该集中在哪里。 因为您在添加控件后直接进行调用,所以移动对象还不会发生。 一旦它完成移动,有很多方法可以让你得到这个位置。 你们似乎并没有马上用这个姿势做什么,所以你们可以做出一个表情。如果您以后使用并且只需要一次:

public Point position() => this.TransformToVisual(box).Transform(new Point(0, 0))
;
或 通过调用UpdateLayout强制布局进程

stackPanel.Children.Add(box);
stackpanel.UpdateLayout();
position = this.TransformToVisual(box).Transform(new Point(0, 0))
或 使用dispatcher延迟计算

stackPanel.Children.Add(box);
Application.Current.Dispatcher.InvokeAsync(new Action(() => 
{  
   position = this.TransformToVisual(box).Transform(new Point(0, 0))

}), DispatcherPriority.ContextIdle);

看来这跟这个有关。。。事实上,我必须初始化一个自定义控件,它的某些部分取决于某些其他元素的位置,因此该位置在同一调用堆栈中是必需的。第二个解决方案看起来很吸引人,但对我来说没有任何作用。如果你仍然被卡住,那么我认为一个自包含的示例将是一个想法,它将演示这个问题。这样人们就可以复制你所看到的并探索这个问题。