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
.