Xamarin.Android, как отписаться от View Tree Observer в
У меня есть вид дерева просмотра, как это:
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
должны быть переменными члена класса.