从另一个页面返回后,UWP无法在文本框中设置文本

时间:2018-07-08 08:41:24

标签: c# .net multithreading windows-10 windows-10-universal

我有一个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线程。我没有收到任何错误或异常,但是我无法设置文本或更好的文本,没有设置它显示的文本,而是实际显示在文本框中。

我怀疑我可能存在同步问题,或者页面有两个实例,并且正在设置一个我看不到的实例,因为它被另一个实例覆盖了吗?我不知道,我被卡住了。

谢谢!

1 个答案:

答案 0 :(得分:1)

如果要使用这种方式传递参数,则在调用Frame.GoBack方法时需要保持原始页面不变。因此,您需要将第一页的NavigationCacheMode设置为Required

<Page <!-- some XAML code -->
      NavigationCacheMode="Required"
      >

NavigationCacheMode.Required的作用是对页面进行缓存,并且无论帧的缓存大小如何,每次访问都将重新使用缓存的实例。导航到该框架时,不会每次都为该框架创建页面的新实例。