UWP C# 跨页面发送自定义事件实现支付成功记录功能问题求助
代码失效的核心原因
- 事件订阅的对象不匹配:你在Page2的
Initialization方法里手动new Page1()创建的是全新的Page1实例,和用户实际输入金额、点击按钮的Page1不是同一个对象,你订阅的是新实例的事件,原页面触发事件自然不会触发Page2的对应方法。 - 订阅逻辑未执行:
Initialization方法你没有主动调用过,就算订阅对象是对的,整个订阅逻辑也根本没有运行。 - 页面生命周期适配问题:UWP默认每次导航到新Page都会创建新实例,就算本次订阅成功,下次打开Page2时之前的订阅也会失效,而且支付记录需要可持久存储,不能依赖临时的事件触发。
最简可行方案(适合新手,改动量小)
直接用App类作为全局共享载体存储支付记录,所有页面都可直接读写:
1. 修改App.xaml.cs,新增全局支付记录存储
sealed partial class App : Application { // 全局支付记录列表,所有页面均可访问 public static List<string> PaymentRecords { get; set; } = new List<string>(); // 原有代码无需修改 }
2. 修改Page1的按钮点击逻辑,支付成功后写入记录
private void Button_Click(object sender, RoutedEventArgs e) { // 保留你原有支付成功判断逻辑 if (/* 支付成功条件 */) { // 把支付信息写入全局记录,可自定义格式 App.PaymentRecords.Add($"支付成功:{Money.Text}元 | 时间:{DateTime.Now:yyyy-MM-dd HH:mm}"); } this.Frame.Navigate(typeof(MainBankPage)); }
3. 修改Page2,每次打开页面时自动加载所有记录
public sealed partial class Page2 : Page { public Page2() { this.InitializeComponent(); } // 页面每次被导航到时触发,刷新支付记录 protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); // 清空原有内容避免重复加载 RootLayout.Children.Clear(); // 遍历所有全局记录生成文本块 foreach (var record in App.PaymentRecords) { var textblock = new TextBlock(); textblock.Margin = new Thickness(0, 20, 15, 0); textblock.Width = 400; textblock.Height = 60; textblock.FontSize = 20; textblock.HorizontalAlignment = HorizontalAlignment.Left; textblock.Text = record; RootLayout.Children.Add(textblock); } } }
后续优化方向
如果项目复杂度持续提升,可逐步改用更规范的实现:
- 引入MVVM模式,用全局ViewModel统一管理所有业务数据,比存放在App类中更易维护
- 使用事件聚合器(例如MVVM Toolkit自带的WeakReferenceMessenger)实现跨页面弱引用消息通知,避免强引用导致的内存泄漏
- 把支付记录持久化存储到本地Sqlite数据库或应用设置中,重启应用后记录依然存在
内容的提问来源于stack exchange,提问作者wpsimon09
相关产品推荐
相关产品推荐

