我在我的项目中尝试了两个页面:MainPage.xaml和DetailPage.xaml.
在MainPage.xaml.cs中,我设置了一个事件来导航到DetailPage
private void Import_Button_Click(object sender, RoutedEventArgs e)
{
this.Frame.Navigate(typeof(DetailPage));
}
在DetailPage.xaml.cs中,我用参数将事件设置为NavigateBack
private async void DoneButton_Click(object sender, RoutedEventArgs e)
{
RenderTargetBitmap renderTarget = new RenderTargetBitmap();
await renderTarget.RenderAsync(swapChainPanel);
IBuffer pixelBuffer = await renderTarget.GetPixelsAsync();
DataReader dataReader = DataReader.FromBuffer(pixelBuffer);
byte[] bytes = new byte[pixelBuffer.Length];
dataReader.ReadBytes(bytes);
ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
localSettings.Values["thumbnail"] = bytes;
localSettings.Values["test setting"] = "a device specific setting";
Frame.GoBack();
}
我不知道如何直接返回字节数组和字符串。所以我使用LocalSettings来存储参数,但如果数据太大,它会给出以下错误:
状态管理器设置值的大小已超过限制。
那么如何正确返回数据呢?我需要将数据保存为文件并只返回路径吗?
如何在UWP 中导航返回时正确返回数据
GoBack
不传递参数,因此您需要通过外部通道传递数据。
一种可能性是生成Action参数,将其从MainPage
传递给DetailPage
。并在从DetailPage
调用GoBack
之前调用此操作。
例如
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
_backAction = new Action<byte[]>((para) =>
{
// get bytes here with para.
});
}
private Action<byte[]> _backAction;
private void Next_Click(object sender, RoutedEventArgs e)
{
this.Frame.Navigate(typeof(DetailPage),_backAction);
}
}
详细信息页面
public sealed partial class DetailPage : Page
{
public DetailPage()
{
this.InitializeComponent();
}
private Action<byte[]> backAction;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
backAction = e.Parameter as Action<byte[]>;
}
private async void BackButton_Click(object sender, RoutedEventArgs e)
{
RenderTargetBitmap renderTarget = new RenderTargetBitmap();
await renderTarget.RenderAsync(this);
IBuffer pixelBuffer = await renderTarget.GetPixelsAsync();
DataReader dataReader = DataReader.FromBuffer(pixelBuffer);
byte[] bytes = new byte[pixelBuffer.Length];
dataReader.ReadBytes(bytes);
backAction(bytes);
Frame.GoBack();
}
}