You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现设置页Picker选项变更时自动重载AboutPage主页面

问题原因

你的代码不生效有两个核心问题:

  1. 赋值逻辑写错:Settings页面的Picker选中事件里,你把选中值赋给了页面局部变量system,根本没有更新App类下的全局变量system_global,AboutPage读到的永远是旧值。
  2. 生命周期触发不稳定: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 23:54:24