WPF C#结合Material Design实现页面间数据传递方案咨询
WPF C#结合Material Design页面导航的参数传递方案
1. 构造函数传参
这是最直接的传参方式,在目标页面的构造函数中定义参数,实例化页面时直接传入数据。
示例代码:
// 目标页面TargetPage.xaml.cs public partial class TargetPage : Page { public TargetPage(string transferMessage) { InitializeComponent(); // 将参数绑定到页面控件 InfoTextBlock.Text = transferMessage; } }
导航时实例化页面并传入参数:
// 导航触发代码(比如主窗口或起始页面中) var targetPage = new TargetPage("来自首页的传递内容"); // 结合Material Design的Transitioner控件替换当前内容 Transitioner.Content = targetPage;
2. 公共属性传参
如果不想修改构造函数,可以给目标页面添加公共属性,实例化页面后再赋值。
示例代码:
// 目标页面TargetPage.xaml.cs public partial class TargetPage : Page { public string TransferMessage { get; set; } public TargetPage() { InitializeComponent(); // 页面加载后读取属性值 Loaded += (s, e) => InfoTextBlock.Text = TransferMessage; } }
导航时赋值并切换页面:
var targetPage = new TargetPage(); targetPage.TransferMessage = "通过公共属性传递的内容"; Transitioner.Content = targetPage;
3. MVVM模式下的ViewModel传参
如果项目采用MVVM架构,可以通过共享ViewModel实例来传递数据,这更符合Material Design的开发实践。
首先定义一个共享的ViewModel:
public class SharedDataViewModel : INotifyPropertyChanged { private string _transferContent; public string TransferContent { get => _transferContent; set { _transferContent = value; OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
起始页面的ViewModel中初始化该实例并赋值:
public class HomeViewModel { public SharedDataViewModel SharedVm { get; } = new SharedDataViewModel(); public void NavigateToTarget() { SharedVm.TransferContent = "通过共享ViewModel传递的内容"; // 通过命令绑定通知视图执行导航操作 } }
目标页面绑定到该ViewModel:
<!-- TargetPage.xaml --> <Page.DataContext> <local:SharedDataViewModel /> </Page.DataContext> <TextBlock Text="{Binding TransferContent}" />
导航时确保目标页面的DataContext指向同一个ViewModel实例:
var targetPage = new TargetPage(); targetPage.DataContext = sharedViewModelInstance; Transitioner.Content = targetPage;
4. 事件反向传参
如果需要从目标页面向起始页面传递数据,可以通过自定义事件实现。
目标页面定义事件:
public partial class TargetPage : Page { public event EventHandler<string> DataReturned; private void BackButton_Click(object sender, RoutedEventArgs e) { // 触发事件传递返回数据 DataReturned?.Invoke(this, "从目标页面返回的消息"); // 导航回起始页面 Transitioner.Content = new HomePage(); } }
导航时订阅事件:
var targetPage = new TargetPage(); targetPage.DataReturned += (s, returnedMessage) => { // 处理返回的数据 MessageBox.Show(returnedMessage); }; Transitioner.Content = targetPage;
内容的提问来源于stack exchange,提问作者user16906859
相关产品推荐
相关产品推荐

