如何实现设置页Picker选项变更时自动重载AboutPage主页面
问题原因
你的代码不生效有两个核心问题:
- 赋值逻辑写错:Settings页面的Picker选中事件里,你把选中值赋给了页面局部变量
system,根本没有更新App类下的全局变量system_global,AboutPage读到的永远是旧值。 - 生命周期触发不稳定:
OnAppearing只会在页面从导航栈中重新变为可见状态时触发,如果你在设置页修改值的时候,AboutPage没有经历「隐藏-重新显示」的流程,你写在OnAppearing里的更新逻辑根本不会执行。
可行方案(推荐用全局事件通知,稳定性最高)
这种全局配置变更的场景,不要强依赖页面生命周期,用事件做变更通知是最稳妥的实现,改完即时生效,不需要重新加载页面。
第一步:在App类中定义全局变更事件
打开App.xaml.cs,添加事件和触发方法,统一管理全局变量的变更通知:
public partial class App : Application { // 全局度量单位配置:0=公制,1=英制 public int system_global { get; set; } = 0; // 单位配置变更事件,所有需要响应配置变化的页面都可以订阅 public static event EventHandler UnitSettingChanged; // 触发事件的公共方法 public static void NotifyUnitSettingChanged() { UnitSettingChanged?.Invoke(null, EventArgs.Empty); } public App() { InitializeComponent(); // 你的其他初始化逻辑 } }
第二步:修正Settings页面的赋值逻辑
修改Picker的选中事件,正确更新全局变量,改完立刻发变更通知:
private void Picker_SelectedIndexChanged(object sender, EventArgs e) { // 修正:把选中值赋值给全局变量,而不是页面局部变量 ((App)App.Current).system_global = Picker_Settings.SelectedIndex; test.Text = "Update:" + ((App)App.Current).system_global.ToString(); // 发通知告诉所有订阅页面:配置改了 App.NotifyUnitSettingChanged(); }
第三步:修改AboutPage的更新逻辑
把UI更新逻辑抽成独立方法,同时在页面加载时订阅全局事件,页面显示时也执行一次更新,兼容首次加载、应用切后台返回等场景,记得取消订阅避免内存泄漏:
public AboutPage() { InitializeComponent(); // 订阅全局配置变更事件 App.UnitSettingChanged += OnUnitSettingUpdated; } private void OnUnitSettingUpdated(object sender, EventArgs e) { // 改UI必须切主线程,避免线程异常 MainThread.BeginInvokeOnMainThread(UpdateUnitRelatedUI); } // 抽离所有和单位配置相关的UI更新逻辑 private void UpdateUnitRelatedUI() { int system = ((App)App.Current).system_global; test.Text = system.ToString(); if (system == 0) { devide = 100; Label_distance.Text = "Distance travelled (km):"; } else if (system == 1) { devide = 1; Label_distance.Text = "Distance travelled (miles):"; } // 后续如果要加距离数值换算、其他单位文本更新,都写在这里 } protected override void OnAppearing() { base.OnAppearing(); // 页面显示时同步一次配置,覆盖首次加载、页面切回等场景 UpdateUnitRelatedUI(); } protected override void OnDisappearing() { base.OnDisappearing(); // 页面消失时取消事件订阅,防止内存泄漏 App.UnitSettingChanged -= OnUnitSettingUpdated; }
备选方案(不推荐,仅适合简单场景)
如果你不想写事件逻辑,先修正Settings页的全局变量赋值bug,再确认你的导航逻辑:从AboutPage跳转到Settings页用的是PushAsync,从Settings页返回AboutPage用的是PopAsync,这种导航流程下AboutPage返回时一定会触发OnAppearing,你写在生命周期里的更新逻辑就能正常跑。但这个方案强依赖导航流程,后期改导航逻辑很容易失效,不建议用。
内容的提问来源于stack exchange,提问作者wanna_be_programmer
相关产品推荐
相关产品推荐

