如何让AppShell的FlyoutItem导航前执行按钮点击逻辑?
解决方案
步骤1:重构MainPage的保存逻辑,抽成公共方法
把按钮点击里的保存代码单独抽离成公共方法,不用模拟按钮点击,更简洁可控:
MainPage.xaml.cs
public MainPage() { InitializeComponent(); one.Text = Preferences.Get("One", "FIRST"); } // 抽离公共保存方法,方便外部调用 public void SaveData() { one.Text = j1.Text; Preferences.Set("One", one.Text); } private void savebtnClicked(object sender, EventArgs e) { SaveData(); // 按钮点击直接调用公共方法 }
步骤2:修改AppShell,拦截导航并触发保存
在AppShell后台代码中监听导航事件,当要跳转到Page2时,先执行MainPage的保存操作:
AppShell.xaml.cs
public partial class AppShell : Shell { public AppShell() { InitializeComponent(); Navigating += AppShell_Navigating; } private void AppShell_Navigating(object sender, ShellNavigatingEventArgs e) { // 判断目标是否是Page2页面 if (e.Target.Location.OriginalString.Contains("page2")) { // 获取当前显示的MainPage实例 if (Current.CurrentItem?.CurrentItem?.Content is MainPage mainPage) { mainPage.SaveData(); // 执行保存 } } } }
同时修正AppShell.xaml里的路由重复问题(两个FlyoutItem不能用同一个Route):
AppShell.xaml
<FlyoutItem Title="HOME"> <ShellContent ContentTemplate="{DataTemplate local:MainPage}" Route="MainPage" /> </FlyoutItem> <FlyoutItem Title="TWO"> <ShellContent ContentTemplate="{DataTemplate local:page2}" Route="Page2" /> <!-- 修改Route为Page2 --> </FlyoutItem>
步骤3:修改Page2,在页面显示时加载最新数据
原来Page2的构造函数只执行一次(Shell会缓存页面实例),改成每次页面显示时读取最新数据:
page2.xaml.cs
public page2() { InitializeComponent(); } protected override void OnAppearing() { base.OnAppearing(); // 每次进入页面都获取最新的Preferences数据 tone.Text = Preferences.Get("One", "FIRST"); }
问题根源说明
- 原FlyoutItem导航直接跳转,未触发MainPage的保存逻辑,导致数据没更新到Preferences
- Page2构造函数仅在首次加载时执行,后续进入页面不会重新读取数据
- AppShell中重复的Route会导致导航逻辑混乱
修改后,点击「TWO」的FlyoutItem时会先自动保存MainPage的数据,再跳转到Page2,且Page2每次显示都会读取最新数据,解决了重启才能看到更新的问题。
内容的提问来源于stack exchange,提问作者Dasheno
相关产品推荐
相关产品推荐

