如何在page2.xaml.cs中获取page1.xaml.cs的公共变量(不使用Frame.Navigate)
几种跨页面获取Page1变量的可行方案
既然你没法用Frame.Navigate传递参数,还需要随时拿到Page1里的var1值,这里有几个实用的实现方式,你可以根据项目情况挑合适的:
1. 单例模式(快速直接的方案)
如果你的Page1在应用生命周期里只会实例化一次,改成单例模式是最省事的,Page2能直接拿到它的实例访问var1。
修改Page1.xaml.cs:
public partial class Page1 : Page { // 定义单例实例 private static Page1 _instance; public static Page1 Instance => _instance ?? (_instance = new Page1()); public string var1 = "hello world"; private Page1() { InitializeComponent(); } }
然后在Page2.xaml.cs的按钮点击事件里调用:
private void Button_Click(object sender, RoutedEventArgs e) { string value = Page1.Instance.var1; // 这里就成功获取到var1的值了 }
注意:如果
Page1会被多次实例化,单例模式就不适用了,得换下面的方法。
2. 借助Application类共享数据
WPF/UWP的Application是全局类,你可以把需要共享的变量放到它的属性里,或者用它的Resources字典存储。
比如在App.xaml.cs里加一个属性:
public string SharedVar1 { get; set; }
然后在Page1里初始化或同步更新这个值:
public Page1() { InitializeComponent(); ((App)Application.Current).SharedVar1 = var1; // 如果var1会动态变化,记得在变化时同步更新这个属性 }
在Page2的按钮点击事件里获取:
private void Button_Click(object sender, RoutedEventArgs e) { string value = ((App)Application.Current).SharedVar1; }
3. 事件通知+实例传递(适合动态变化场景)
如果var1是会动态改变的,你希望Page2能实时感知到变化,可以用事件机制,配合实例传递来实现。
首先在Page1里定义事件并改造var1为属性:
public event Action<string> Var1Changed; private string _var1 = "hello world"; public string var1 { get => _var1; set { _var1 = value; Var1Changed?.Invoke(value); // 值变化时触发事件 } }
然后在Page2里,先拿到Page1的实例(比如通过Application属性保存,或者导航时传递),再订阅事件:
private Page1 _page1Instance; // 假设通过构造函数传入Page1实例 public Page2(Page1 page1) { InitializeComponent(); _page1Instance = page1; _page1Instance.Var1Changed += OnVar1Changed; } // 响应var1变化的方法 private void OnVar1Changed(string newValue) { // 这里能拿到最新的var1值 } // 按钮点击时获取当前值 private void Button_Click(object sender, RoutedEventArgs e) { string currentValue = _page1Instance.var1; }
这种方式适合需要实时响应变量变化的场景,比单纯取值更灵活。
4. 静态类存储共享数据
创建一个静态类来存放跨页面共享的变量,所有页面都能直接访问:
public static class AppData { public static string Var1 { get; set; } = "hello world"; }
在Page1里同步更新这个值:
// 可以直接把原来的var1替换成AppData.Var1,或者在需要时同步 AppData.Var1 = var1;
在Page2的按钮点击事件里获取:
private void Button_Click(object sender, RoutedEventArgs e) { string value = AppData.Var1; }
这个方法最简单,但要注意静态变量的生命周期,避免内存泄漏,适合存储全局通用的简单数据。
内容的提问来源于stack exchange,提问作者Cruwiel
相关产品推荐
相关产品推荐

