Xamarin Forms:是否有 ViewElement 的 ViewDisappeared 事件?

Xamarin Forms: Is there a ViewDisappeared event for ViewElement?

我一直在尝试处理 ViewElement/View,当显示它的 Page 不再位于 Xamarin Forms 中的 NavigationStack 之上时。

Xamarin Community Toolkit 似乎有一个名为 LifecycleEffect 的新效果可以做到这一点,但是当新页面放在顶部时 Unloaded 事件不会触发NavigationStack 的(因此视图元素不会被删除并且不会触发事件)。

有谁知道我可以绑定到 View 上的事件,让我可以确定它没有显示,但仍在 NavigationStack 某处?

我真的希望 View 自己执行此操作,而不是为此使用 Page

提前致谢:)

据我所知,没有平台这样做,因为它有点贵(对于几乎不需要的东西):每次页面隐藏或显示时,都必须在屏幕上的每个视觉元素上执行一个方法。

唯一的解决方案(我知道)是让这个视图向它所在的页面添加一个“事件处理程序”,然后让页面的 OnDisappearing 调用该事件处理程序。定义一个公开“AddActionOnDisappearing”方法的接口。在可能具有此视图的页面上实现该接口。

第一个版本:一个手工编码的解决方案:

public interface IActionOnDisappearing
{
    void AddActionOnDisappearing(Action action)
    {
    }
}

public partial class MyPage : IActionOnDisappearing
{
    ...
    public void AddActionOnDisappearing(Action action)
    {
        ... remember the action somewhere ...
    }
    protected override void OnDisappearing()
    {
        ... call that action or event handler ...
        ...
    }
}

public partial class MySpecialView
{
    // constructor
    void MySpecialView(IActionOnDisappearing owningPage)
    {
        ...
        TellMeThePage(owningPage);
    }

    public void TellMeThePage(IActionOnDisappearing owningPage)
    {
        owningPage.AddActionOnDisappearing( () =>
           ... whatever you need to do ...
           );
    }

}

请注意,视图构造函数带有一个参数。 另一种方法是让 XAML 在页面上构建视图,给该视图一个 x:Name 属性,然后在页面的构造函数中,在 InitializeComponent 之后,连接两者:

public partial class MyPage : IActionOnDisappearing
{
    // constructor
    void MyPage()
    {
        InitializeComponent();
        this.NameOfMySpecialView.TellMeThePage(this);
        ...
    }
}


public partial class MySpecialView
{
    // constructor
    void MySpecialView()
    {
        ...
    }

    public void TellMeThePage(IActionOnDisappearing owningPage)
    ...
}

我省略了 MyPage 需要的事件处理程序的详细信息。 Google 有关该主题的信息。


第二个版本

上面的解决方案要求页面知道它有这样一个视图。并给那个视图一个名字。并在构造函数中添加一行代码。

为了更容易编码,在某处定义:

public static void TellMySpecialDescendents(Page owner)
{
    ... search all children and their children
    ... any that are of type `MySpecialView`, call
        ((MySpecialView)child).TellMeThePage(owner);
}

定义 class BasePage,实现 IActionOnDisappearing。任何可能具有此类视图的 class 都继承自 BasePage。

并从此类页面的构造函数中调用 TellMySpecialDescendents。当然是 InitializeComponent 之后。

如果您有多个这样的视图类型需要了解其所有者,请定义一个接口:

public interface IViewOnDisappearing
{
    void TellMeThePage(IActionOnDisappearing owningPage);
}

public partial class MySpecialView : IViewOnDisappearing
...

并将 MySpecialView 替换为 IViewOnDisappearing