0

我一直在尝试处理ViewElement/ViewPage显示它不再NavigationStack位于 Xamarin Forms 的顶部时。

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

有没有人知道我可以绑定到一个View允许我确定它没有显示但仍然在NavigationStack某个地方的事件?

我真的想View自己做这件事,而不是为此使用Page

提前致谢 :)

4

1 回答 1

1

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

唯一的解决方案(我知道)是让这个视图向它所在的页面添加一个“事件处理程序”,然后让页面的 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 需要的事件处理程序的详细信息。谷歌有关该主题的信息。


第二版

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

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

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。任何可能具有此类视图的类都继承自 BasePage。

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

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

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

public partial class MySpecialView : IViewOnDisappearing
...

MySpecialView并将使用替换为IViewOnDisappearing.

于 2021-07-19T15:39:01.850 回答