Xamarin中无需重载Page1如何获取其他页面Preferences值更新Label
解决方案
这里提供3种无需重载Page1即可实时更新Label的实现方式,你可以根据自己的项目习惯选择:
方案1:监听弹窗关闭事件(改量最少,最适配当前场景)
你使用的Rg.Plugins.Popup的PushAsync方法是异步Task,弹窗完全关闭后才会执行后续代码,直接在弹窗关闭后读取最新的Preferences赋值即可:
修改Page1.xaml.cs的one_Clicked方法:
private async void one_Clicked(object sender, EventArgs e) { // 加await等待弹窗关闭 await PopupNavigation.Instance.PushAsync(new Popup()); // 弹窗关闭后直接读取最新值更新Label getPreferences.Text = Preferences.Get("PreOne", "defaultpre"); }
方案2:委托回调(无全局依赖,耦合度低)
给Popup页加回调委托,Preferences更新后主动通知Page1更新:
- 首先修改
Popup.xaml.cs,新增回调属性并在点击事件中触发:
// 新增公共回调属性 public Action<string> OnPreferenceUpdated { get; set; } private void ss_Tapped(object sender, EventArgs e) { string setone = "01"; Preferences.Set("PreOne", setone); // 触发回调,把更新后的值传给调用方 OnPreferenceUpdated?.Invoke(setone); // 可选:点击后关闭弹窗 PopupNavigation.Instance.PopAsync(); }
- 修改
Page1.xaml.cs的one_Clicked方法,绑定回调处理逻辑:
private async void one_Clicked(object sender, EventArgs e) { var popup = new Popup(); // 绑定回调,收到更新后直接修改Label popup.OnPreferenceUpdated += (newValue) => { getPreferences.Text = newValue; }; await PopupNavigation.Instance.PushAsync(popup); }
方案3:MessagingCenter消息订阅(适合多页面广播场景)
用Xamarin/MAUI自带的消息中心做跨页面通知:
- 修改
Popup.xaml.cs的点击事件,更新完Preferences后发送通知:
private void ss_Tapped(object sender, EventArgs e) { string setone = "01"; Preferences.Set("PreOne", setone); // 发送更新消息 MessagingCenter.Send(this, "PreOneValueChanged", setone); PopupNavigation.Instance.PopAsync(); }
- 修改
Page1.xaml.cs,在构造函数中订阅消息,页面销毁时取消订阅避免内存泄漏:
public Page1() { InitializeComponent(); string getpre = Preferences.Get("PreOne", "defaultpre"); getPreferences.Text = getpre; // 订阅更新消息 MessagingCenter.Subscribe<Popup, string>(this, "PreOneValueChanged", (sender, newValue) => { getPreferences.Text = newValue; }); } protected override void OnDisappearing() { base.OnDisappearing(); // 离开页面时取消订阅 MessagingCenter.Unsubscribe<Popup, string>(this, "PreOneValueChanged"); }
内容的提问来源于stack exchange,提问作者Chim Di Tru
相关产品推荐
相关产品推荐

