问题描述
我有一个像这样的视图树观察者:
rowsContainerVto = rowsContainerView.ViewTreeObserver;
rowsContainerVto.GlobalLayout += RowsContainerVto_GlobalLayout;
void RowsContainerVto_GlobalLayout (object sender, EventArgs e)
{
if(rowsContainerVto.IsAlive)
rowsContainerVto.GlobalLayout -= RowsContainerVto_GlobalLayout;
vW = rowsContainerView.Width;
Console.WriteLine ("\r now width is " + vW);
}
它应该做的是在视图布局后找到宽度,它完美地完成。 我只是无法弄清楚如何阻止这种情况一次又一次地运行。
以上基本上是基于所提出的建议。 这只会让应用程序崩溃。 当我摆脱“IsAlive”时,循环会永远持续下去。 在第一次绘制和布局之后,我似乎无法找到阻止它的方法。
1楼
由于您的EventHandler是匿名的,因此您无法再次取消订阅,因为您没有对其进行引用。
如果你想留在相同的范围,你可以做如下的事情:
EventHandler onGlobalLayout = null;
onGlobalLayout = (sender, args) =>
{
rowsContainerVto.GlobalLayout -= onGlobalLayout;
realWidth = rowsContainerView.Width;
}
rowsContainerVto.GlobalLayout += onGlobalLayout;
或者,您可以将EventHandler作为方法:
private void OnGlobalLayout(sender s, EventArgs e)
{
rowsContainerVto.GlobalLayout -= OnGlobalLayout;
realWidth = rowsContainerView.Width;
}
rowsContainerVto.GlobalLayout -= OnGlobalLayout;
这只意味着rowsContainerVto
和realWidth
必须是类成员变量。