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 должны быть переменными члена класса.

Другие вопросы по тегам