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)
| 归档时间: |
|
| 查看次数: |
7979 次 |
| 最近记录: |