gpt4 book ai didi

c# - 如何删除 Xamarin 中的 ViewTreeObserver?

转载 作者:太空宇宙 更新时间:2023-11-03 19:48:28 26 4
gpt4 key购买 nike

假设我需要获取和设置 View 的高度。在 Android 中,众所周知只有在绘制后才能获得 View 高度。如果您使用的是 Java,有很多答案,最著名的方法之一就是下面这个,摘自 this answer :

view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
view.getHeight(); //height is ready
}
});

因此我搜索了 C#/Xamarin 版本,发现这个有效:

int viewHeight = 0;
ViewTreeObserver vto = view.ViewTreeObserver;
vto.GlobalLayout += (sender, args) =>
{
viewHeight = view.Height;
};

事情是,它一次又一次地开火。在 Java 版本中,它可以被删除view.getViewTreeObserver().removeOnGlobalLayoutListener(this);

如何在 C#\Xamarin 中实现?我应该使用 boolean 属性来知道它是否被执行了吗?有没有办法像安卓那样做?

最佳答案

如果您正在使用 C# 事件,如果您需要取消订阅,请避免使用匿名事件,或者您可以实现 IOnGlobalLayoutListener 并添加/删除监听器:

C# 事件处理程序样式:

为要调用的事件创建一个 EventHandler 方法:

void Globallayout_handler(object sender, EventArgs e)
{
// ViewTreeObserver.IOnGlobalLayoutListener events
}

订阅:

var viewTreeObserver = aView.ViewTreeObserver;
viewTreeObserver.GlobalLayout += Globallayout_handler;

取消订阅:

var viewTreeObserver = aView.ViewTreeObserver;
viewTreeObserver.GlobalLayout -= Globallayout_handler;

C# 中的 Java 监听器样式:

添加并实现ViewTreeObserver.IOnGlobalLayoutListener:

public class CustomButtonRenderer : Xamarin.Forms.Platform.Android.AppCompat.ButtonRenderer,
ViewTreeObserver.IOnGlobalLayoutListener
{
~~~~

public void OnGlobalLayout()
{
// ViewTreeObserver.IOnGlobalLayoutListener events
}
}

现在您可以使用 Java 方式添加和删除此监听器:

aView.ViewTreeObserver.RemoveOnGlobalLayoutListener(this); 

aView.ViewTreeObserver.AddOnGlobalLayoutListener(this);

关于c# - 如何删除 Xamarin 中的 ViewTreeObserver?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42575932/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com