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
。
我一直在尝试处理 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
。