我有一个UWP应用。我叫一个扫描仪控件,可以通过相机进行条形码扫描。它有一个回调,可通过操作将结果返回。所以,基本上,我在MainPage上,然后单击以启动扫描器,如下所示:
scanner.Scan(scanOptions).ContinueWith(t =>
{
if (t.Result != null)
HandleScanResult(t.Result);
});
上述调用在scan.Scan方法中将调用Frame.Navigate进入扫描器控制页面。扫描完成后,我首先调用Frame.Navigate返回MainPage,然后返回结果,该结果将在ContinueWith中调用上述HandleScanResult。这就是我导航到扫描页面并返回的方式:
public override async Task<Result> Scan(MobileBarcodeScanningOptions options)
{
var rootFrame = RootFrame ?? Window.Current.Content as Frame ?? ((FrameworkElement) Window.Current.Content).GetFirstChildOfType<Frame>();
var dispatcher = Dispatcher ?? Window.Current.Dispatcher;
var tcsScanResult = new TaskCompletionSource<Result>();
await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
rootFrame.Navigate(typeof(ScanPage), new ScanPageNavigationParameters
{
Options = options,
ResultHandler = r =>
{
tcsScanResult.SetResult(r);
},
Scanner = this,
ContinuousScanning = false
});
});
var result = await tcsScanResult.Task;
await dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
{
if (rootFrame.CanGoBack)
rootFrame.GoBack();
});
return result;
}
到目前为止,一切正常,我可以导航到扫描页面并再次返回。如您所见,我每次都调用Dispatcher同步回UI线程。调用时:
HandleScanResult(t.Result);
我在t.Result中有Result,这样很好。问题在于,在该方法中,我尝试在MainPage的文本框中设置字符串。调试时,我可以看到文本框上的Text属性具有字符串,但是方法完成后,文本框仍为空白。我还确保也用分派器包装文本框Text属性的设置,以便将其同步到UI线程。我没有收到任何错误或异常,但是我无法设置文本或更好的文本,没有设置它显示的文本,而是实际显示在文本框中。
我怀疑我可能存在同步问题,或者页面有两个实例,并且正在设置一个我看不到的实例,因为它被另一个实例覆盖了吗?我不知道,我被卡住了。
谢谢!
答案 0 :(得分:1)
如果要使用这种方式传递参数,则在调用Frame.GoBack
方法时需要保持原始页面不变。因此,您需要将第一页的NavigationCacheMode
设置为Required
。
<Page <!-- some XAML code -->
NavigationCacheMode="Required"
>
NavigationCacheMode.Required
的作用是对页面进行缓存,并且无论帧的缓存大小如何,每次访问都将重新使用缓存的实例。导航到该框架时,不会每次都为该框架创建页面的新实例。