2017-02-16 14 views
1

に表示ツリーオブザーバーから退会するには:ビューがレイアウトされた後、幅を見つけるために行うことですなっている何Xamarin.Android、どのように私はこのようなビューツリーオブザーバを持って

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はクラスメンバー変数でなければなりません。

関連する問題