C#/Xamarin:出现/消失事件不会触发

Dan*_*ins 5 c# prism mvvm xamarin xamarin.forms

更新:我进一步研究了这个问题,发现这是一个 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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我在主页上添加了两个按钮,它们以两种不同的方式导航到上述页面:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

观察结果与之前相同,使用 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.xaml.cs 之外,EventPage 与基本 Prism ContentPage 模板没有任何变化,其中我已将基本处理程序分配给 Appearing 和 Disappearing 事件:

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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的 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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我使用await _navigationService.NavigateAsync("EventPage");事物进行导航时,它们的行为完全符合预期。两个事件处理程序都在它们应该被调用的时候被调用。

但是,当我使用await navigationService.NavigateAsync("http://app.com/EventPage");导航时,在导航到页面时会调用 Appearing 事件,使用后退按钮关闭应用程序将导致调用 Disappearing 事件。所有其他时间关闭和重新打开应用程序都无法调用任一事件。

我在 Github 问题页面上找不到任何对此的引用,并希望确保在发布之前没有遗漏任何明显的内容。

小智 5

使用以下覆盖方法而不是自定义

出现()

protected override void OnAppearing()
{
    base.OnAppearing();
}
Run Code Online (Sandbox Code Playgroud)

OnDisappearing()

protected override void OnDisappearing()
{
     base.OnDisappearing();
}
Run Code Online (Sandbox Code Playgroud)


小智 0

我认为你在OnAppearing创建方法时删除了一些东西。

尝试添加base.OnAppearing(); 回该OnAppearing方法。