Template10 ZXing框架和导航

时间:2016-07-20 09:58:34

标签: uwp zxing template10

我已经开始使用Template10并且正在尝试将ZXing条形码扫描仪放入应用程序中。但是我对ZXing和Template10的工作方式存在一些问题。

当我启动ZXing扫描仪时,它似乎用自己的布局覆盖所有当前帧和内容。因此,当我发起取消操作时,没有什么可以回去的。

框架始终位于启动它的页面上,因此Template10无法理解发生的任何事情。

我的代码:

public async Task ScanQR()
{
    try
    {
        var scanner = new ZXing.Mobile.MobileBarcodeScanner();

        var _overlay = new Views.Scanner();
        _overlay._cancel.Click += (object sender, RoutedEventArgs e) => { scanner.Cancel(); };
        _overlay._torch.Click += (object sender, RoutedEventArgs e) => { scanner.ToggleTorch(); };

        scanner.CustomOverlay = _overlay;
        scanner.UseCustomOverlay = true;

        var result = await scanner.Scan();
        if (result != null)
        {
             // Handle Result
        }
    }
}

正如您在快照(1)(2)中看到的那样,应用程序上的堆叠面板将被覆盖。如您所见,它取代了[Frame] - > [ContentPresenter]及其内部的那些。

如何在取消代码时将代码恢复到上一页?我知道我可能需要以某种方式封装它,但我找不到任何关于它的东西。一直在寻找有类似问题的人。所以我转向你们。

(1)。 Before ZXing.Scan()

(2)。 After ZXing.Scan()

---加法信息---

在不使用Template10的普通应用程序上解决此问题的方法是使用以下代码处理后退请求。这是我在某个论坛上找到的东西,现在不记得来源了。

如果此代码不存在,当您按下手机上的硬件后退按钮时,应用程序就会关闭。当我在手机上尝试Template10项目时,它会做同样的事情。在PC上,你没有后退按钮。

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);

        var currentView = SystemNavigationManager.GetForCurrentView();
        if (!ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons"))
        {
            currentView.AppViewBackButtonVisibility = this.Frame.CanGoBack ?
                AppViewBackButtonVisibility.Visible : AppViewBackButtonVisibility.Collapsed;
        }
        currentView.BackRequested += SystemNavigationManager_BackRequested;
    }

    private void SystemNavigationManager_BackRequested(object sender, BackRequestedEventArgs e)
    {
        if (this.Frame.CanGoBack)
        {
            this.Frame.GoBack();
            e.Handled = true;
        }
    }

2 个答案:

答案 0 :(得分:1)

您是否检查过导航堆栈以查看之前的视图是否存在?如果是,您可以轻松调用Template10导航服务并调用GoBack

答案 1 :(得分:1)

  

当我启动ZXing扫描仪时,它似乎用自己的布局覆盖所有当前帧和内容。因此,当我发起取消操作时,没有什么可以回去的。

从您的照片中我认为您正在使用Template 10 Hamburger来构建您的应用。然后Xaml树是这样的:Window.Current.Content - >壳牌 - > SplitView - >框架 - >主页。

只需阅读Zxing MobileBarcodeScanner的源代码,在创建新的Scanner实例时,它会从应用的rootFrame导航到Scanner / CustomerScanner页面,这就是为什么你的" Shell"在Zxing.Scan()之后消失了。所以基本上,如果您需要取消操作/导航回到最后一页,您可以使用rootFrame.GoBack();返回。

只有问题是,rootFrame.CanGoBack是错误的。如果您查看App.xaml.cs中的代码,在任务OnInitializeAsync中,它会设置" Shell"页面作为Window.Current.Content的内容,它没有使用Frame.Navigate方法导航到页面,为了使rootFrame.CanGoBack成为现实,我们可以手动添加Shell页面到Backstack喜欢这样:

if (Window.Current.Content as ModalDialog == null)
{
    // create a new frame
    var nav = NavigationServiceFactory(BackButton.Attach, ExistingContent.Include);
    // create modal root
    Window.Current.Content = new ModalDialog
    {
        DisableBackButtonWhenModal = true,
        Content = new Views.Shell(nav),
        ModalContent = new Views.Busy(),
    };
    var rootFrame = Window.Current.Content as Frame;
    rootFrame.BackStack.Add(new Windows.UI.Xaml.Navigation.PageStackEntry(typeof(Views.Shell), null, null));
}

然后在您的扫描仪页面的取消方法中:

var rootFrame = RootFrame ?? Window.Current.Content as Frame ?? ((FrameworkElement)Window.Current.Content).GetFirstChildOfType<Frame>();
if (rootFrame.CanGoBack)
{
    rootFrame.GoBack();
}