首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Template10 ZXing帧与导航

Template10 ZXing帧与导航
EN

Stack Overflow用户
提问于 2016-07-20 09:58:33
回答 2查看 377关注 0票数 2

我已经开始使用Template10,并试图在应用程序中安装一个ZXing条形码扫描仪。但我对ZXing和Template10的工作方式有一些意见。

当我启动ZXing扫描器时,它似乎用自己的布局编写了所有当前的框架和内容。因此,当我启动取消操作时,就没有什么可返回的了。

框架总是在启动它的页面上,因此Template10不理解正在发生的任何事情。

我的代码:

代码语言:javascript
复制
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)上看到的那样,应用程序上的堆叠面板被覆盖。如您所见,它取代了框架->ContentPresenter和内部的内容。

取消时,如何使代码返回到前一页?我知道我可能需要以某种方式将它封装起来,但我找不到任何关于它的东西。一直在四处寻找有类似问题的人。所以我求助于你们。

(1)。在ZXing.Scan()之前

(2)。在ZXing.Scan()之后

-补充资料

在不使用Template10的正常应用程序上,解决此问题的解决方案是使用以下代码处理回退请求。这是我在某个论坛上发现的东西,现在不记得消息来源了。

如果没有此代码,则当您按下电话上的“硬件后退”按钮时,应用程序就会关闭。当我在手机上尝试Template10项目时,它也会做同样的事情。在个人电脑上,你没有后退按钮。

代码语言:javascript
复制
    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;
        }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-21 06:40:50

当我启动ZXing扫描器时,它似乎用自己的布局编写了所有当前的框架和内容。因此,当我启动取消操作时,就没有什么可返回的了。

从你的照片中,我认为你正在使用模板10汉堡来构建你的应用程序。然后Xaml树是这样的: Window.Current.Content -> Shell -> SplitView -> Frame -> MainPage。

只要阅读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中,如下所示:

代码语言:javascript
复制
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));
}

然后在“扫描程序”页面的“取消”方法中:

代码语言:javascript
复制
var rootFrame = RootFrame ?? Window.Current.Content as Frame ?? ((FrameworkElement)Window.Current.Content).GetFirstChildOfType<Frame>();
if (rootFrame.CanGoBack)
{
    rootFrame.GoBack();
}
票数 1
EN

Stack Overflow用户

发布于 2016-07-20 15:38:30

您是否检查了导航堆栈,以确定是否存在前面的视图?如果是的话,您可以轻松地调用Template10导航服务并调用GoBack

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38478088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档