gpt4 book ai didi

navigation - 如何为 Xamarin.Forms( View )导航堆栈重置 Prism?

转载 作者:行者123 更新时间:2023-12-01 07:53:01 26 4
gpt4 key购买 nike

在尝试从我的应用程序发送电子邮件时,我正在解决 Prism.Forms (v6.2.0) 和 Xamarin Messaging Plugin (Xam.Plugins.Messaging v3.2.1) 之间的冲突。

以下代码 - 从我的 ViewModel 之一执行:

using Plugin.Messaging;

if (MessagingPlugin.EmailMessenger.CanSendEmail)
{
var email = new EmailMessageBuilder()
.To("test@testemail.com")
.Subject("Email subject here!")
.Body("Dear friend,\nI would like to say...\n\n\n")
.Build();
MessagingPlugin.EmailMessenger.SendEmail(email);
}

产生此错误 - 要发送的电子邮件永远不会出现在屏幕上:

Warning: Attempt to present <MFMailComposeViewController: 0x108fb4400> on <Xamarin_Forms_Platform_iOS_PageRenderer: 0x107de67c0> whose view is not in the window hierarchy!



我相信这是因为 Messaging 插件的 iOS 特定部分有一个 .GetVisibleViewController()寻找具有可见 View 的 UIViewController 以显示要发送的电子邮件的方法;它正在寻找一个 iOS 不喜欢的 View Controller 。

我想指出,在不使用 Prism.Forms 的 MVVM 模式 Xamarin.Forms 应用程序中,我有几乎相同的代码(与上面显示的代码相同)运行没有问题[编辑:Brian L. 指出这个问题是可能不是由 Prism 引起的,我倾向于同意他的观点;它更有可能与两个应用程序之间“导航流程”的细微差异有关,即使电子邮件构建/发送代码相同]。当 MessagingPlugin.EmailMessenger.SendEmail(email);行执行,屏幕上应该弹出一封电子邮件,收件人、主题和正文如代码所示;并带有发送或取消按钮。这在非 Prism Xamarin.Forms 应用程序中工作正常。

所以,我已经解决了这个问题,足以使 .SendEmail(email)方法调用正常工作。我必须将我的 X.F 页面(即我的 View 模型的 View )传递给特定于 iOS 的项目代码以调用 .CreateViewController()在上面。我用这个新的 UIViewController 作为它的 RootViewController 创建一个 UIWindow,然后创建该窗口 .MakeKeyAndVisible() .我已经调整了 Xam.Plugins.Messaging 的代码,让我传入一个 UIViewController 来使用。后 .SendEmail(email)方法调用发生,我处理我新创建的 UIWindow;这样我在发送或取消电子邮件后就看不到它了。

这一切都有效,并允许我按预期使用 Messaging 插件的电子邮件发送功能。

我唯一剩下的问题是,在发送电子邮件后,对我的原始 ViewModel 的 navigationService 实例(即尝试发送电子邮件的 ViewModel,使用上面的代码)的导航调用都失败了。发送电子邮件后,我的 View / View 模型上的其他功能正常工作;但调用 navigationService.GoBackAsync()navigationService.NavigateAsync()失败并产生一个熟悉的错误:

Warning: Attempt to present <Xamarin_Forms_Platform_iOS_ModalWrapper: 0x1359c21a0> on <Xamarin_Forms_Platform_iOS_PlatformRenderer: 0x133df9640> whose view is not in the window hierarchy!



我相信我想要做的是重置我的 Prism NavigationService( View )堆栈,类似这样(Xamarin.Forms 的代码,没有 Prism):
Navigation.InsertPageBefore(new HomePage(), Navigation.NavigationStack.First());
Navigation.PopToRootAsync(true);

但是我没有看到像 Prism NavigationService 那样进行“导航堆栈更改操作”的方法。但也许其他人会这样做?

提前致谢...

最佳答案

I have almost identical code (to that shown above) running without problems in an MVVM-patterned Xamarin.Forms app that does not use Prism.Forms



几乎相同,不相同。我想提一下,Prism 对 MVVM 没有什么特别之处。它只是为您设置 Page.BindingContext。就是这样。因此,如果您在没有 Prism 的应用程序中仅使用 View 和 VM,则使用 Prism 没有区别。

要回答您的问题,要重置导航堆栈,您只需使用绝对 URI。
NavigateAsync("myapp:///NavigationPage/MainPage")
这相当于 MainPage = new NavigationPage(new MainPage());

关于navigation - 如何为 Xamarin.Forms( View )导航堆栈重置 Prism?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40273884/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com