【问题标题】:C#/Xamarin: Appearing/Disappearing events don't fireC#/Xamarin:出现/消失的事件不会触发
【发布时间】: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


【解决方案1】:

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

OnAppearing()

protected override void OnAppearing()
{
    base.OnAppearing();
}

OnDisappearing()

protected override void OnDisappearing()
{
     base.OnDisappearing();
}

【讨论】:

  • 仅供参考,这相当于将处理程序附加到 AppearingDisappearing 事件,所以我希望它的行为与问题中报告的完全相同。
【解决方案2】:

我认为您在创建 OnAppearing 方法时删除了某些内容。

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

【讨论】:

  • 不,您描述的内容与protected override void OnAppearing() 时相关。尽管 OP 将他的函数命名为 EventPage_OnAppearing,但请注意它不是 override void OnAppearing。不要被函数名误导;它只是一个事件处理程序;它没有base 版本。
【解决方案3】:

ContentPage 类从层次结构中的某个位置派生一个虚拟 OnAppearing() 方法。尝试覆盖该函数。

【讨论】:

  • 这不是真正的答案,而是评论。一旦您有足够的声誉,您就可以对帖子发表评论。
猜你喜欢
  • 1970-01-01
  • 2013-01-15
  • 2015-03-25
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
相关资源
最近更新 更多