c# - 为什么在 Xamarin Forms 中调用 Navigation.InsertPageBefore() 后导航对我不起作用?
问题描述
我正在尝试在 Xamarin Forms(5.0.0,使用 ActiveDirectory 的内置登录页面)上实现登录。关于如何使这项工作的任何想法?
在 App.xaml.cs 的构造函数中,我有:
public App()
{
InitializeComponent();
MainPage = new NavigationPage(new LoginPage());
}
我实现了带有视图模型的登录页面,我在其中传递了一个回调,该回调应该(根据文档)将我的导航根设置为我的主页:
public partial class LoginPage : ContentPage
{
private async Task _handleLoginAsync()
{
Navigation.InsertPageBefore(new HomePage(), this);
await Navigation.PopAsync();
}
public LoginPage()
{
InitializeComponent();
BindingContext = new LoginPageViewModel(_handleLoginAsync);
}
}
在视图模型中,我尝试使用 Device.BeginInvokeOnMainThread 登录,调用 my(注意,为了简洁/简洁,我没有包含登录逻辑)
public Command LoginCommand => new Command(LoginUsingAzureAsync);
private Func<Task>_handleLoginAsync;
public LoginPageViewModel(Func<Task> handleLoginAsync)
{
_handleLoginAsync = handleLoginAsync;
LoginCommand.Execute(null);
}
internal void LoginUsingAzureAsync()
{
Device.BeginInvokeOnMainThread(async () =>
{
try
{
if (await Login()) == true)
{
UserDialogs.Instance.HideLoading();
await _handleLoginAsync();
return;
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
UserDialogs.Instance.Alert("The login has failed.");
}
});
}
它成功进入主页,但之后导航到其他页面不起作用。当我调用以下内容时,它进入OtherPage()
构造函数,但无法呈现新页面。
Navigation.PushAsync(new OtherPage());
请注意,如果我使用而不是删除登录名,导航将按预期工作PushAsync(new HomePage())
,但我更愿意从导航堆栈中删除登录页面。
提前致谢!
更新:这是最初的 HomeViewModel:
public class HomeViewModel
{
private readonly INavigation _navigation;
public Command GoToOtherPageCommand => new Command(GoToOtherPage);
public async void GoToOtherPage()
{
await App.Navigation.PushAsync(new OtherPage());
}
}
解决方案
问题不在于登录,而在于 HomePageViewModel,它最初引用了 App.Navigation(请参阅有问题的更新)。
将导航传递到我的 ViewModel 中就可以了:
public class HomeViewModel
{
private readonly INavigation _navigation;
public Command GoToOtherPageCommand => new Command(GoToOtherPage);
public async void GoToOtherPage()
{
await _navigation.PushAsync(new OtherPage());
}
public HomeViewModel(INavigation navigation)
{
_navigation = navigation;
}
}
public partial class HomePage : ContentPage
{
public HomePage()
{
InitializeComponent();
BindingContext = new HomeViewModel(Navigation);
}
}
推荐阅读
- java - 如何将对象转换为仅在运行时已知的类型?
- c# - 第二次点击后页面是否刷新?
- mysql - 如何使用 MySQL 子查询和 GROUP BY
- android - Delphi 通过 AIDL 连接打印服务
- ruby-on-rails - 查找数组的每个子数组包含的值
- python-3.x - 将输入字符串分成两个偶数部分或长度为奇数时,将中间字符留在第一部分。(仅布尔值)
- c++ - 运行简单的 .oct 文件时 Octave 崩溃,我的代码有什么问题?
- .net - 图像出现在预览中,但在我启动程序时不会出现
- javascript - 如何绑定以 url 表示的 api 数据?
- haskell - 有没有办法在 Haskell 的 main 之外接收 IO?