当前位置: 代码迷 >> Android >> Xamarin.Android,如何取消订阅View Tree Observer
  详细解决方案

Xamarin.Android,如何取消订阅View Tree Observer

热度:134   发布时间:2023-08-04 12:14:16.0

我有一个像这样的视图树观察者:

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”时,循环会永远持续下去。 在第一次绘制和布局之后,我似乎无法找到阻止它的方法。

由于您的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;

这只意味着rowsContainerVtorealWidth必须是类成员变量。

  相关解决方案