TransformToAncestor并不总是有效

时间:2015-07-22 12:55:48

标签: c# wpf stackpanel

我目前正在制作我的第一个WPF应用。 我从一些XML文件中获取数据,并根据该文件在堆栈面板上填充了一些动态创建的按钮。

稍后我需要从我使用方法的特定按钮中检索X坐标:

private double GetStationCoordinates(int stationIdx)
    {
        foreach (Button station in StationMap.Children)
        {
            if (stationIdx != Convert.ToInt16(station.Tag)) continue;
            var relativePoint = station.TransformToAncestor(Application.Current.MainWindow).Transform(new Point(0, 0));
            //Console.WriteLine(stationIdx + " " + relativePoint.ToString());
            return relativePoint.X;
        }
        return 0;
    }

然后我使用这个坐标在按钮下的其他面板中绘制一些点。一切正常,直到我设置我的主窗口属性

SizeToContent="WidthAndHeight"

现在 - 当我在启动应用程序后第一次绘制我的点数时(在我用按钮填充StackPanel之后),所有(点)都会收到相同的X坐标--11。 当我点击“刷新”按钮时,一切都很好。但是第一个画面 - 添加按钮后就出现了问题。 当我重新加载按钮配置xml文件时,会出现同样的问题。我首先清除StackPanel中的所有子项并用新的子项填充它。在第一次点数绘制被打破之后 - GetStationCoordinates为每个按钮返回11。 它是否以某种方式连接到主窗口的自动调整属性?

1 个答案:

答案 0 :(得分:0)

你可能正试图获得尚未正确定位的元素的位置。使用以下两种方法中的任何一种将该代码推迟到视图加载之前:

a)订阅视图的Loaded事件并在那里进行。

private void Window_Loaded(object sender, EventArgs e)
{
    this.Loaded -= Window_Loaded;  // Or else it could get called again later

    int id;
    // do stuff

    GetStationCoordinates(id);
}

b)将其置于与Dispatcher.BeginInvoke

的异步调用中
private void SomeCode()
{
    int id;
    // do other stuff

    Dispatcher.BeginInvoke(new Action(() =>
        {
            GetStationCoordinates(id);
        }),
        DispatcherPriority.Loaded);
}