更改父级后立即调用TransformToVisual

时间:2018-04-01 12:23:19

标签: c# wpf xaml

我正在使用TransformToVisual来获取控件相对于其父级的位置。在将此控件添加到StackPanel后,我需要此位置,但是,我获得的结果是(0, 0)翻译。

如果使用Task将此方法延迟一毫秒,结果就会很好。

我不理解这种行为,因为我没有做任何线程。有人有解决方案来处理这个问题(没有任务)吗?

这是缩短的代码:

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

1 个答案:

答案 0 :(得分:1)

当你在那里添加一个孩子时,控制在孩子身上,并且使用测量和排列机制来确定它应该集中在哪里。 因为你在添加控件后直接进行调用,所以还没有发生移动事物。 一旦完成移动,有很多方法可以获得该位置。 你似乎没有立即做任何事情,所以你可以做出表达。如果你以后使用它,只需要一次:

white-space

或者 通过调用UpdateLayout强制布局过程

public Point position() => this.TransformToVisual(box).Transform(new Point(0, 0))
;

或者 使用调度程序推迟计算。

stackPanel.Children.Add(box);
stackpanel.UpdateLayout();
position = this.TransformToVisual(box).Transform(new Point(0, 0))