1

我正在尝试使用以下代码行通过 TransformToVisual 方法获取用户控件的位置:

this.TransformToVisual(ParentElement).Transform(new Point());

如果控件是在 XAML 中定义的,那么坐标就可以了。但现在我想像这样动态定义控件:

stackPanel.Children.Add(new Control());

坐标被移动,TransformToVisual 方法忽略边距和对齐(返回堆栈面板的左上角)。

XAML 层次结构如下:

<Grid x:Name="ParentElement">
    <StackPanel>
        <StackPanel>
            <Border>
                <StackPanel>
                    <TextBlock  />
                    <StackPanel x:Name="stackPanel" />
                </StackPanel>
            </Border>
        </StackPanel>
    </StackPanel>
</Grid>

所以我的问题是:有没有办法再次正确获取坐标?

谢谢,奎蒂

4

2 回答 2

1

我能够自己解决问题:

如果我在调用 TransformToVisual() 之前调用 UpdateLayout() 方法,坐标不再是坏的。ActualWidth 和 height 属性还有其他一些小问题,它们返回为零。我通过在 Dispatcher.BeginInvoke 委托中调用这些属性来解决这个问题。

于 2012-06-06T05:54:54.197 回答
1

我想为此添加一些东西,因为我遇到了一个非常相似的问题,它给我带来了一段时间的问题。当我在 WinRT for Windows 8.1 中的 UIElement 上访问 Dispatcher 时,我找不到 BeginInvoke 方法,因此我无法尝试您列出的解决方案。

经过一些测试,虽然我认为我的问题的根本原因是更改 UI 的布局,然后在系统有时间正确更新布局之前调用 TransformToVisual。这可能与您上面提到的问题相同。我发现在没有影响其布局的 UI 片段上运行 TransformToVisual 会返回正确的结果,只有在存在问题的地方更新布局的 UI 片段。

似乎当更改布局以使 TransformToVisual 正常工作时,UI 必须有机会对布局更新做出“反应”。在我的情况下,我正在更改布局,然后在调用 TransformToVisual 之后立即更改(在 Tapped 事件处理程序中,一行紧随其后)。由于这些调用都在相同的方法中,UI 可能无法在布局更新和调用 TransformToVisual 之间处理任何新消息(我假设布局更新作为消息推送到 UI 处理循环上) . 如果我将 TransformToVisual 移到 MouseUp 事件中(当时我正在使用鼠标),那么一切正常。可能在您的情况下调用 BeginInvoke 在它“推动”的地方做了很多相同的事情

于 2014-02-10T03:02:43.577 回答