如何在同一页面上使用Xamarin.Form控件和本机控件

我想在我的原生Android页面控件中使用Xamarin.Form控件。 在我的Android原生页面中有没有办法在我的原生Android片段或LinearLayout中加载Xamarin.Form页面?

根据Xamarin的说法,这是可能的。 但我找不到如何实现这一目标。

http://xamarin.com/forms

有几件事正在讨论中,所以请耐心等待:

根据我的理解,图片摘录:

"Not only are Xamarin.Forms pages mixable with custom screens" ... 

这就像@Stephane提到允许应用程序使用本机屏幕以及 Xamarin.Forms屏幕。 每个平台 存根页面都可以在应用程序的任何位置引入共享的Xamarin.Forms页面。 您不必使用Xamarin.Forms 导航堆栈

  "but you can embed custom views built directly against Xamarin.IOS and Xamarin.Android into Xamarin.Forms pages." 

这就是@Sten所提到的,如果您创建特定于平台的 ContentRenderers,您可以将任何types的本机控件呈现到现有的 Xamarin.Forms页面,方法是将此常用View传递给每个平台渲染器。

所以,例如,如果你有一个视图 : –

  public class MyView : ContentView { // Create some bindable properties here that can be used in your platform specific renderer, // ie DisplayText etc. } 

您可以在Xamarin.Forms页面定义中使用上述内容,然后创建将调用以呈现内容的 特定平台的呈现器

在这些平台特定的内容渲染器类中 ,您可以在每个平台上使用本机控件

例如,在ContentRenderer中 ,对于事件OnElementChanged,您可以对WindowsPhone执行以下操作: –

  protected override void OnElementChanged(Xamarin.Forms.Platform.WinPhone.ElementChangedEventArgs e) { base.onElementChanged(e); ... System.Windows.Controls.TextBox objPlatformSpecificTextBox = new System.Windows.Controls.TextBox(); ... ... 

但是,@ Gulshan真正想要的是我认为有一个本地页面Xamarin.Forms内容被渲染 已经存在的本机页面中 的特定点的 中心阶段

在思考方面有点逆转,但这仍然是可能的: –

要实现这一点,您需要将页面生成刺激到临时新页面

例如,在WindowsPhone中,您可以通过以下方式执行此操作:

  PhoneApplicationPage objInnerPage_Temp = new PhoneApplicationPage(); UIElement objInnerContent = App.GetMainPage().ConvertPageToUIElement(objInnerPage_Temp); 

特定平台的存根页面上

然后,您可以呈现的内容注入适合平台的本机容器 ,即Grid

更新1: –

==========

虽然在WindowsPhone上很容易做到这一点,但在Android中尝试类似的东西时,这似乎不太可能。

Android页面创建非常严格 ,即您无法访问其内部在AndroidActivity中使用的canvas和/或布局私有字段。

如果这是可能的,那么您可以重新使用它并获取呈现的内容并注入类似于WindowsPhone平台的解决方案。

此外, Platform类也被标记为内部 ,防止以另一种方式生成呈现的内容。

我希望通过Fragment实现生成一个Activity来实现这一点,并且这可能很有效 – 但是 – 这里的问题是Xamarin.Forms中的实现期望ActionBar可用于它不是,并且他们没有检查if null方案,以允许执行在没有可用的情况下继续执行,因此它会抛出阻止页面内容生成的exception。

它看起来不可能吗?除非它们打开AndroidActivity中的布局/canvas字段或解决ActionBar期望问题。

正如已经讨论的那样,它在iOS (使用.CreateViewController() )和WP.ConvertPageToUIElement() )上相当简单。

但在Android上也不会丢失:您可以使用http://www.arturdr.ru/android/xamarin-forms-i-slozhnosti-integratsii-v-android-prilozheniya/中的 .GetView()扩展方法

以下是如何使用该方法在Android AlertDialog中包装Xamarin.Forms页面的示例: https : //github.com/OlexaLe/XFPageAsAndroidDialog

您可能正在寻找自定义渲染器。

  • 在您的Forms项目中创建一个inheritance自View的类MyView(或其他一些合适的类,如果您有子视图等,请说ContentView)
  • 在您的Android项目中,创建一个inheritanceViewRenderer的渲染器类MyViewRenderer
  • 在属性声明[assembly: ExportRenderer (typeof(MyView), typeof(MyViewRenderer))] 之前 ,将该属性添加到该类,指示它是渲染器
  • 在MyViewRenderer中重写OnElementChanged,调用base.SetNativeView(ctl) ,其中ctl是本机控件的实例

看看Xamarin的指南

Xamarin论坛的另一个资源。

在查看问题并实现我自己的边框后,我会说VisualElementRenderer是一个更好的渲染器。 如果您使用它,那么您需要做的就是重写OnElementChanged并执行NativeView.Add(customUIView)并从MyView实例复制属性。 要处理这些属性中的动态更改,请重写OnElementPropertyChanged并更新customUIView实例

Xamarin修改了其网站,因此上面的图片已经过时了。 随着Xamarin.Forms库的发展,似乎混合Xamarin.Forms和特定于平台的本机视图变得更加困难。 我不建议这样做。

高级用户当然可以尝试这样做,但我与其他开发人员的对话表明,这会产生大量额外的工作和开销。 最好的方法是将Xamarin.Forms专门用于您的视图,或使用特定于平台的本机视图。

这是Xamarin的Xamarin.Forms页面的截图(拍摄于2015年5月13日):

在此处输入图像描述

您可以通过inheritanceXamarin.Forms.Platform.Android.AndroidActivity来创建由Xamarin.Forms支持的新Activity ,并从您的Xamarin.Android应用程序中的另一个启动此新活动。