Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TransformToVisual方法对于动态控件无法正常工作_C#_Silverlight_Transformtovisual - Fatal编程技术网

C# TransformToVisual方法对于动态控件无法正常工作

C# TransformToVisual方法对于动态控件无法正常工作,c#,silverlight,transformtovisual,C#,Silverlight,Transformtovisual,我试图通过TransformToVisualMethod使用以下代码行获取用户控件的位置: this.TransformToVisual(ParentElement).Transform(new Point()); 如果控件是用XAML定义的,那么坐标是正确的。但现在我想定义控件动态如下: stackPanel.Children.Add(new Control()); 坐标移动,TransformToVisual方法忽略边距和对齐(返回stackpanel的左上角) XAML层次结构如下所示

我试图通过TransformToVisualMethod使用以下代码行获取用户控件的位置:

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可能与它“推送”要完成的新工作的情况大致相同,这导致队列中的任何等待工作(布局更新)首先被处理