【发布时间】:2017-08-30 22:08:25
【问题描述】:
更新:我进一步调查了这个问题,发现这是一个 Xamarin.Forms 问题。
为了证明这个问题,我从一个基本的 PLC 模板创建了以下简单的 Xamarin.Forms 应用程序。
我添加了一个新页面,其中包含用于 Appearing 和 Disappearing 事件的简单处理程序。
using System;
using System.Diagnostics;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace TestApp
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class EventPage : ContentPage
{
public EventPage()
{
InitializeComponent();
Appearing += EventPage_OnAppearing;
Disappearing += EventPage_OnDisappearing;
}
private void EventPage_OnAppearing(object sender, EventArgs e)
{
Debug.WriteLine("Appeared");
}
private void EventPage_OnDisappearing(object sender, EventArgs e)
{
Debug.WriteLine("Disappeared");
}
}
}
然后我在主页上添加了两个按钮,它们以两种不同的方式导航到上述页面:
using System;
using Xamarin.Forms;
namespace TestApp
{
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
private void WorkingButton_OnClicked(object sender, EventArgs e)
{
Navigation.PushAsync(new EventPage());
}
private void NonWorkingButton_OnClicked(object sender, EventArgs e)
{
Application.Current.MainPage = new EventPage();
}
}
}
观察结果与之前相同,使用 PushAsync 的行为符合预期,但设置根页面意味着不会触发事件。
当我使用此行
await _navigationService.NavigateAsync($"http://app.com/NavigationPage/HomePage/AlertPage"); 重置堆栈时,这出现在我的实际项目中,因此问题似乎不仅仅局限于根页面。
我在当前项目中遇到了这个问题,该项目使用 Xamarin Forms v2.3.4.192-pre2 和 Prism 6.3.0-pre2 (Unity),并在以下测试应用程序中使用 Xamarin Forms 2.3.3.193 和 Prism 6.3.0 (Dryloc)。我在 LG G5、Android 7.0 上运行。
我不确定这是 Prism 问题还是 Xamarin Forms 问题,因为我不太确定如何将其重写为纯 Forms。
为了证明这个问题,我做了以下测试应用。
EventPage 与基本 Prism ContentPage 模板相比没有任何变化,除了 EventPage.xaml.cs,我已将基本处理程序分配给出现和消失事件:
using System;
using System.Diagnostics;
using Xamarin.Forms;
namespace PrismErrorDemo.Views
{
public partial class EventPage : ContentPage
{
public EventPage()
{
InitializeComponent();
Appearing += EventPage_OnAppearing;
Disappearing += EventPage_OnDisappearing;
}
private void EventPage_OnAppearing(object sender, EventArgs e)
{
Debug.WriteLine("Appeared");
}
private void EventPage_OnDisappearing(object sender, EventArgs e)
{
Debug.WriteLine("Disappeared");
}
}
}
我的 MainPage 有两个简单的按钮可以导航到我的 EventPage,一个是相对的,一个是绝对的。
using System;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
namespace PrismErrorDemo.ViewModels
{
public class MainPageViewModel : BindableBase
{
private readonly INavigationService _navigationService;
public DelegateCommand WorkingCommand { get; set; }
public DelegateCommand NonWorkingCommand { get; set; }
public MainPageViewModel(INavigationService navigationService)
{
_navigationService = navigationService;
WorkingCommand = new DelegateCommand(WorkingCommandAction);
NonWorkingCommand = new DelegateCommand(NonWorkingCommandAction);
}
private async void WorkingCommandAction()
{
await _navigationService.NavigateAsync("EventPage");
}
private async void NonWorkingCommandAction()
{
await _navigationService.NavigateAsync("http://app.com/EventPage");
}
}
}
当我使用await _navigationService.NavigateAsync("EventPage"); 导航时,事情的表现完全符合它们应有的行为。两个事件处理程序都在它们应该被调用的时候被调用。
但是,当我使用await navigationService.NavigateAsync("http://app.com/EventPage"); 导航时,当我导航到页面时,我会收到一个调用的 Appearing 事件,并且使用后退按钮关闭应用程序将导致调用一个 Disappearing 事件。所有其他时间关闭和重新打开应用程序都无法调用任一事件。
我在 Github 问题页面上找不到任何对此的参考,我想确保在发布之前我没有遗漏任何明显的东西。
【问题讨论】:
-
您是否尝试在此处记录错误:bugzilla.xamarin.com/describecomponents.cgi
-
顺便说一句,最好说出您正在测试什么设备或模拟器。 Android、iOS、UWP?
-
您是否找到任何解决方案或解决方法?我现在正在尝试解决完全相同的问题
标签: c# xamarin mvvm xamarin.forms prism