【问题标题】:Template10 ZXing Frames and NavigationTemplate10 ZXing 框架和导航
【发布时间】:2016-07-21 14:40:50
【问题描述】:

我已经开始使用 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;
        }
    }

【问题讨论】:

    标签: uwp zxing template10


    【解决方案1】:

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

    根据您的图片,我认为您正在使用 Template 10 Hamburger 来构建您的应用程序。那么 Xaml 树是这样的:Window.Current.Content -> Shell -> SplitView -> Frame -> MainPage。

    只需阅读ZxingMobileBarcodeScanner的源代码,当创建一个新的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));
    }
    

    然后在 Scanner 页面的 Cancel 方法中:

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

    【讨论】:

    • 感谢您非常详尽的回答和对像我这样的新人的友好帮助。我看到你在这里做了什么,但我对取消方法的代码有疑问。它抱怨当前框架中不存在“RootFrame”,并且 FrameworkElement 不包含 GetFirstChildOfType
    • @Magnus,问题不大,RootFrame只需要像public Frame RootFrame;一样在这个方法之外定义,GetFirstChildOfType方法属于ZXing.Mobile,你需要使用代码中的这个命名空间。
    【解决方案2】:

    您是否检查了导航堆栈以查看上一个视图是否存在?如果是,您可以轻松调用 Template10 Navigation 服务并调用 GoBack

    【讨论】:

    • 这是我的第一个想法。我试图调用 NaviagtaionService.GoBack() 似乎 ZXing 没有创建新的页面/框架/视图。 NavigationService.CanGoBack 为 false 且 NavigationService.Content 仍为“MainPage”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多