c# - MvvmCross、UWP、MessengerPlugin : Failed to load Page

标签 c# mvvmcross xamarin.uwp

问题是:当我将 IMvxMessanger 的构造函数 DI 添加到 ViewModel 时,出现错误:“无法加载页面";如果我删除这个 DI,我的工具就可以正常工作。顺便说一句,IHelloService 不会给出这个错误,只有在没有 IMvxMessanger 的情况下它才能正常工作。

我遵循了本手册:https://mvvmcross.com/docs/a-windows-universal-app-platform-project

MvvmCross 版本:4.4.0

代码示例:

第一 View 模型

public class FirstViewModel : MvxViewModel
{
    private readonly IHelloService _helloService;
    private readonly IMvxMessenger _messenger;

    public FirstViewModel(IHelloService helloService, IMvxMessenger messenger)
    {
        _helloService = helloService;
        _messenger = messenger;
    }

    private string _hello = "Hello MvvmCross";
    public string Hello
    {
        get { return _hello; }
        set { SetProperty(ref _hello, value); }
    }
}

FirstView.xaml.cs

public sealed partial class FirstView : MvxWindowsPage
{
    public FirstView()
    {
        InitializeComponent();
    }
}

FirstView.xaml

<views:MvxWindowsPage
x:Class="MvvmCrossDocs.UWP.Views.FirstView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MvvmCrossDocs.UWP.Views"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:views="using:MvvmCross.WindowsUWP.Views"
mc:Ignorable="d">

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel>
        <TextBox Text="{Binding Hello, Mode=TwoWay}" />
        <TextBlock Text="{Binding Hello}" />
    </StackPanel>
</Grid>

设置

public class Setup : MvxWindowsSetup
{
    public Setup(Frame rootFrame) : base(rootFrame)
    {
    }

    protected override IMvxApplication CreateApp()
    {
        return new Core.App();
    }
}

App.xaml.cs 中也有这一行

if (rootFrame.Content == null)
{
    var setup = new Setup(rootFrame);
    setup.Initialize();

    var start = Mvx.Resolve<IMvxAppStart>();
    start.Start();
}

最佳答案

我认为问题在于您在 UWP 项目中缺少 MvxMessenger 的 Bootstrap 类。 UWP 使用 Nuget 3 引入的 project.json 模板。目前,当您安装 nuget 包时,它们不允许将附加文件添加到您的项目中。

解决方法是手动添加 bootstrap 文件夹和相关插件 bootstrap.cs 文件,或者您可以在 Setup.cs 中注册插件的接口(interface)和实现.

引导方法:

创建一个MessengerPluginBootstrap.cs

using MvvmCross.Platform.Plugins;

namespace <<YOUR_NAMESSPACE>>.Bootstrap
{
    public class MessengerPluginBootstrap
            : MvxPluginBootstrapAction<MvvmCross.Plugins.Messenger.PluginLoader>
    {
    }
}

Setup.cs 方法:

针对 MvxMessengerHub 实现注册 IMvxMessenger 的接口(interface)。

protected override void InitializeLastChance()
{
    base.InitializeLastChance();
    Mvx.RegisterSingleton<IMvxMessenger>(new MvxMessengerHub());
}

关于c# - MvvmCross、UWP、MessengerPlugin : Failed to load Page,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41282119/

相关文章:

c# - 如何通过索引获取字符串中的字符?

c# - MVVM跨WPF区域实现

dependencies - 非 PCL 依赖 w/MvvmCross

c# - Xamarin.iOS 中的文件选择器

c# - 用一定数量的元素初始化 List<>

c# - 在c#中使用ffmpeg在特定帧数中分割视频

image-processing - 使用 MVVM Cross 对 Android 中的列表的大位图进行重新采样

xamarin.android - Xamarin.Forms(UWP、Droid 和 iOS)的 Breeze#?

Xamarin.Forms (UWP) - 如何获取 WebView 的 DOM 作为 HTML 字符串?

c# - 对于从函数输出参数接收的变量,使用未分配的参数编译器错误?