繁体   English   中英

TransformToAncestor并不总是有效

[英]TransformToAncestor doesn't always work

我目前正在开发我的第一个WPF应用程序。 我从一些XML文件中获取数据,并基于该文件用一些动态创建的按钮填充stackpanel。

稍后,我需要从我使用方法的特定按钮中检索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。 它以某种方式连接到主窗口的autosize属性吗?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM