如何从源代码编译Xamarin Forms并使用程序集?

时间:2016-10-03 19:55:35

标签: xamarin xamarin.forms

我下载了当前Xamarin Forms主分支的副本,编译了它,然后我将这些编译的程序集添加为测试项目的引用:

  • Xamarin.Forms.Core
  • Xamarin.Forms.Platform
  • Xamarin.Forms.Platform.Android
  • Xamarin.Forms.Xaml

测试项目是使用Visual Studio Xamarin Forms项目模板创建的,我修改的唯一内容是Core.csproj和Android.csproj中的引用指向已编译的程序集。

我使用了Xamarin.Forms.Platform.Android项目的bin \ debug \文件夹中的前3个,以及Xamarin.Forms.Xaml bin \ debug文件夹中的最后一个。

我运行测试项目,运行正常,我可以看到默认生成的代码“欢迎使用Xamarin Forms!”中的标签。

接下来,我刚刚修改了MainPage:

public partial class App : Application
{
    public App()
    {
        InitializeComponent();

        MainPage = new NavigationPage(new ContentPage());
    }
}

当我运行该应用时,它会给我一个错误

  

System.ArgumentException:element的类型不是Xamarin.Forms.View

     

参数名称:element

抛出这一行:

        void IVisualElementRenderer.SetElement(VisualElement element)
        {
            if (!(element is TElement))
                throw new ArgumentException("element is not of type " + typeof(TElement), nameof(element));

            SetElement((TElement)element);
        }

这很奇怪。

元素的类型是Xamarin.Forms.NavigationPage,堆栈跟踪是

enter image description here

有人可以帮助我使用已编译的程序集运行测试项目吗?

更新#1:

调用堆栈中的第二个条目显示它无法获取NavigationPageRenderer元素的已注册渲染器(NavigationPage),而是创建默认渲染器(DefaultRenderer),它无法处理元素的类型(NavigationPage)所以它抛出了我看到的异常。

因此,对于NavigationPage,它似乎在NavigationPageRenderer中找不到其渲染器(Registrar)。

    public static IVisualElementRenderer CreateRenderer(VisualElement element)
    {
        UpdateGlobalContext(element);

        IVisualElementRenderer renderer = Registrar.Registered.GetHandler<IVisualElementRenderer>(element.GetType()) ?? new DefaultRenderer();
        renderer.SetElement(element);

        return renderer;
    }

我的感觉是在构建Xamarin Forms时我不知道构建步骤。

2 个答案:

答案 0 :(得分:0)

当你在一些不是从Forms.Page(即ContentPage等)派生的东西上调用InitializeComponent时崩溃了。

应用程序本身不是一个页面,如果你有一个页面,我们称之为'MyCustomPage',它后面有一些Xaml看起来像这样:

$now = new DateTime();
echo $now->format('Y-m-d H:i:s');    // MySQL datetime format
echo $now->getTimestamp(); 

然后在App构造函数中调用

public partial class MyCustomPage : ContentPage
{
  public MyCustomPage()
  {
    InitializeComponent ();
    // Some other setup...
  }
}

由于您是从应用程序的根目录创建空白内容页面,因此无需调用InitializeComponent。

希望这有帮助。

答案 1 :(得分:0)

您还需要参考

Xamarin.Forms.Platform.Android (Forwarders)

来自Android项目。