Template10 ZXing框架和导航
Template10 ZXing Frames and Navigation
我已经开始使用 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 的普通应用程序上解决此问题的方法是使用以下代码处理后退请求。这是我在某个论坛上找到的东西,现在不记得出处了。
如果此代码不存在,应用程序将在您按下 phone 上的硬件后退按钮时关闭。当我在 phone 上尝试 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;
}
}
您是否检查过导航堆栈以查看是否存在上一个视图?如果是,您可以轻松调用 Template10 导航服务并调用 GoBack
When I initiate the ZXing scanner it seems to write over all current frames and content with its own layout. So when I initiate the cancel action, there is nothing left to go back to.
从你的图片来看,我认为你正在使用模板 10 Hamburger 来构建你的应用程序。那么Xaml树是这样的:Window.Current.Content -> Shell -> SplitView -> Frame -> MainPage。
只需阅读 Zxing 的源代码 MobileBarcodeScanner,当创建一个新的 Scanner 实例时,它会从应用程序的 rootFrame
导航到 Scanner
/ [=14] =] 页面,这就是为什么您的 "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();
}
我已经开始使用 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 的普通应用程序上解决此问题的方法是使用以下代码处理后退请求。这是我在某个论坛上找到的东西,现在不记得出处了。
如果此代码不存在,应用程序将在您按下 phone 上的硬件后退按钮时关闭。当我在 phone 上尝试 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;
}
}
您是否检查过导航堆栈以查看是否存在上一个视图?如果是,您可以轻松调用 Template10 导航服务并调用 GoBack
When I initiate the ZXing scanner it seems to write over all current frames and content with its own layout. So when I initiate the cancel action, there is nothing left to go back to.
从你的图片来看,我认为你正在使用模板 10 Hamburger 来构建你的应用程序。那么Xaml树是这样的:Window.Current.Content -> Shell -> SplitView -> Frame -> MainPage。
只需阅读 Zxing 的源代码 MobileBarcodeScanner,当创建一个新的 Scanner 实例时,它会从应用程序的 rootFrame
导航到 Scanner
/ [=14] =] 页面,这就是为什么您的 "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();
}