C# TransformToVisual方法对于动态控件无法正常工作
我试图通过TransformToVisualMethod使用以下代码行获取用户控件的位置:C# TransformToVisual方法对于动态控件无法正常工作,c#,silverlight,transformtovisual,C#,Silverlight,Transformtovisual,我试图通过TransformToVisualMethod使用以下代码行获取用户控件的位置: this.TransformToVisual(ParentElement).Transform(new Point()); 如果控件是用XAML定义的,那么坐标是正确的。但现在我想定义控件动态如下: stackPanel.Children.Add(new Control()); 坐标移动,TransformToVisual方法忽略边距和对齐(返回stackpanel的左上角) XAML层次结构如下所示
this.TransformToVisual(ParentElement).Transform(new Point());
如果控件是用XAML定义的,那么坐标是正确的。但现在我想定义控件动态如下:
stackPanel.Children.Add(new Control());
坐标移动,TransformToVisual方法忽略边距和对齐(返回stackpanel的左上角)
XAML层次结构如下所示:
<Grid x:Name="ParentElement">
<StackPanel>
<StackPanel>
<Border>
<StackPanel>
<TextBlock />
<StackPanel x:Name="stackPanel" />
</StackPanel>
</Border>
</StackPanel>
</StackPanel>
</Grid>
所以我的问题是:有没有办法再次得到正确的坐标
谢谢,Kwite我自己解决了这个问题:
如果在调用TransformToVisual()之前调用UpdateLayout()方法,则坐标不再是坏的。ActualWidth和height属性还有其他一些小问题,它们返回为零。我通过在Dispatcher.BeginInvoke委托中调用这些属性修复了这个问题 我想补充一点,因为我遇到了一个非常类似的问题,这给我带来了一段时间的问题。在WinRT for Windows 8.1中访问UIElement上的Dispatcher时,我找不到BeginInvoke方法,因此无法尝试您列出的解决方案 经过一些测试,我认为问题的根本原因是更改了UI的布局,然后在系统有时间正确更新布局之前调用TransformToVisual。这可能与您上面提到的问题相同。我发现,在布局不受影响的UI部分上运行TransformToVisual会返回正确的结果,只有在存在问题的UI部分上,才会更新布局 似乎当布局被更改以使TransformToVisual正常工作时,UI必须有机会对布局更新作出“反应”。在我的例子中,我更改了布局,然后在调用TransformToVisual之后立即更改了布局(一行接一行,两行都在一个事件处理程序中)。因为这两个调用都在同一个方法中,所以在更新布局和调用TransformToVisual之间,UI可能无法处理任何新消息(我假设布局更新作为UI处理循环上的消息推送)。如果我将TransformToVisual移动到MouseUp事件中(当时我正在使用鼠标),那么一切都正常。在您的案例中,调用BeginInvoke可能与它“推送”要完成的新工作的情况大致相同,这导致队列中的任何等待工作(布局更新)首先被处理