我已经开始使用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)。在ZXing.Scan()之前
(2)。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;
}
}
当我启动ZXing扫描仪时,它似乎以其自己的布局覆盖了所有当前框架和内容。因此,当我启动取消动作时,没有任何可返回的内容了。
从您的图片中,我认为您正在使用Template 10 Hamburger来构建您的应用程序。那么Xaml树是这样的:Window.Current.Content-> Shell-> SplitView-> Frame-> MainPage。
只需阅读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();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句