2017-02-16 25 views
1

У меня есть вид дерева наблюдатель, как это:Xamarin.Android, Как отказаться от View Tree наблюдателя в

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», цикл продолжится навсегда. Я просто не могу найти способ остановить его после того, как он был впервые нарисован и выложен.

ответ

0

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