使用TipCalc的MVVMCross Xamarin.Forms.UWP

时间:2018-12-14 15:27:33

标签: xamarin xamarin.forms uwp mvvmcross

VS2017版本15.9.3,Xamarin Forms 3.4,Mvvmcross 6.2.2

在VS2017中,很高兴使用常见的Xamarin表单项目来生成Android,Ios和UWP项目。

我对使用MVVMCross支持MVVM并减少样板代码感兴趣。

MVVMCross网站提供了有关如何制作UWP TipCalc的教程,而不是如何制作与Android和Ios共享UI代码的Xamarin.Forms.UWP TipCalc的教程。

我认为,如果我使用UWP Tipcalc项目,删除视图并引用Forms.UI和Forms.Core项目,它将正常链接,但显然不正确。

App.xaml

<local:TipCalcApp x:Class="MX_TipCalc.UWP.UWP.App"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:local="using:MX_TipCalc.Forms.UWP.UWP"
          RequestedTheme="Light">
    <Application.Resources>
        <x:String x:Key="WelcomeText">Hello World!</x:String>
    </Application.Resources>
</local:TipCalcApp>

App.xaml.cs

using MvvmCross.Platforms.Uap.Core;
using MvvmCross.Platforms.Uap.Views;

namespace MX_TipCalc.Forms.UWP.UWP
{
    public sealed partial class App
    {
        public App()
        {
            InitializeComponent();
        }
    }

    public abstract class TipCalcApp : MvxApplication<MvxWindowsSetup<Core.App>, Core.App>
    {
    }
}

如何使MVVMCross Xamarin.Forms.UWP项目与TipCalc.Forms.UI和TipCalc.Forms.Core挂钩才能使其正常工作?

谢谢

因此,在Nico Zhu回答之后-MSFT 我的App.xaml是

<local:TipCalcApp x:Class="MX_TipCalc.Forms.UWP.UWP.App"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="using:MX_TipCalc.Forms.UWP.UWP"
                    RequestedTheme="Light">
    <Application.Resources>
        <x:String x:Key="WelcomeText">Hello World!</x:String>
    </Application.Resources>
</local:TipCalcApp>

我的App.xaml.cs是

using MvvmCross.Forms.Platforms.Uap.Core;
using MvvmCross.Forms.Platforms.Uap.Views;
using MX_TipCalc.Forms.UI;

namespace MX_TipCalc.Forms.UWP.UWP
{
    public sealed partial class App
    {
        public App()
        {
        InitializeComponent();
       }
    }

    //public abstract class TipCalcApp : 
MvxApplication<MvxWindowsSetup<Core.App>, Core.App>
    //{
    //}

    public abstract class TipCalcApp : MvxWindowsApplication<MvxFormsWindowsSetup<Core.App, FormsApp>, Core.App, FormsApp, MainPage>
    {
    }
}

我的MainPage.xaml是

<mvxf:MvxFormsWindowsPage
   xmlns:mvxf="using:MvvmCross.Forms.Platforms.Uap.Views"
   x:Class="MX_TipCalc.Forms.UWP.UWP.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:local="using:MX_TipCalc.Forms.UWP.UWP"
   xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
   mc:Ignorable="d">

   <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

   </Grid>

我的MainPage.xaml.cs是

   using MvvmCross.Forms.Platforms.Uap.Views;

   namespace MX_TipCalc.Forms.UWP.UWP
   {
       public partial class MainPage : MvxFormsWindowsPage
       {
       public MainPage()
           {
               InitializeComponent();
           }
       }
   }

好消息-它现在可以毫无问题地构建。

坏消息-它带有System.AccessViolation异常:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。'

我在MX_TipCalc.Forms.UWP.UWP.App.xaml.cs中设置了一个断点

公共App()InitializeComponent

之后转到

    static void Main(string[] args)
    {
        global::Windows.UI.Xaml.Application.Start((p) => new App());
    }

然后

    /// <summary>
    /// GetXamlType(String)
    /// </summary>
    public global::Windows.UI.Xaml.Markup.IXamlType GetXamlType(string fullName)
    {
        return _AppProvider.GetXamlType(fullName);
    }

踩到最后一个花括号后,它崩溃了。那是我所知的极限:-(

下一步

我最新的MainPage.xaml.cs现在是

namespace MX_TipCalc.Forms.UWP.UWP
{
    public partial class MainPage
    {
        public MainPage()
        {
            InitializeComponent();
        }
    }
}

起初,我收到丢失文件“ Interop.Manual.cs”的消息。我多次清洗并重建了解决方案/项目。最终,该消息没有再出现。我检查了TipCalc.UWP(非Forms版本)是否工作以及TipCalc.Forms.Droid是否工作。是的,它们仍然可以工作,但是当我尝试使用TipCalc.Forms.UWP时,它仍然在与以前相同的位置崩溃。

1 个答案:

答案 0 :(得分:1)

我已经配置了uwp平台,其表单ui引用了link。您可以参考以下步骤。

TipCalc.Forms.UI项目添加TipCalc.UWP引用。

enter image description here

用以下代码替换抽象类TipCalcApp

using MvvmCross.Forms.Platforms.Uap.Core;
using MvvmCross.Forms.Platforms.Uap.Views;
using TipCalc.Forms.UI;

namespace TipCalc.UWP
{
    public sealed partial class App
    {
        public App()
        {
            InitializeComponent();
        }
    }

    //public abstract class TipCalcApp : MvxApplication<MvxWindowsSetup<Core.App>, Core.App>
    //{
    //}
    public abstract class TipCalcApp : MvxWindowsApplication<MvxFormsWindowsSetup<Core.App, FormsApp>, Core.App, FormsApp, MainPage>
    {
    }

}

修改MainPage xaml作为主机页面。

<mvxf:MvxFormsWindowsPage
    xmlns:mvxf="using:MvvmCross.Forms.Platforms.Uap.Views"
    x:Class="TipCalc.UWP.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:TipCalc.UWP"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    </Grid>

</mvxf:MvxFormsWindowsPage>

最后,从TipCalc.UWP项目中删除TipView.xaml文件。然后它将起作用。