[英]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.