我目前正在制作我的第一个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。 它是否以某种方式连接到主窗口的自动调整属性?
答案 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);
}