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

Gul*_*han 13 c# android xamarin xamarin.forms

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

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

http://xamarin.com/forms

Pet*_*ete 11

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

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

 "Not only are Xamarin.Forms pages mixable with custom screens" ...
Run Code Online (Sandbox Code Playgroud)

这像什么@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."
Run Code Online (Sandbox Code Playgroud)

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

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

 public class MyView : ContentView
 {
     // Create some bindable properties here that can be used in your platform specific renderer,
     // i.e. DisplayText etc.
 }
Run Code Online (Sandbox Code Playgroud)

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

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

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

 protected override void OnElementChanged(Xamarin.Forms.Platform.WinPhone.ElementChangedEventArgs<MyView> e)
 {
     base.onElementChanged(e);
     ...
     System.Windows.Controls.TextBox objPlatformSpecificTextBox = new System.Windows.Controls.TextBox();
     ... 
     ...
Run Code Online (Sandbox Code Playgroud)

然而,什么是@Gulshan想真的,我相信是有一个本地网页中心舞台Xamarin.Forms内容被渲染成一个特定点在一个已经存在的本地页面.

它的思维方式有点逆转,但这仍然是可能的: -

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

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

        PhoneApplicationPage objInnerPage_Temp = new PhoneApplicationPage();
        UIElement objInnerContent = App.GetMainPage().ConvertPageToUIElement(objInnerPage_Temp);
Run Code Online (Sandbox Code Playgroud)

特定平台的存根页面上.

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

更新1: -

==========

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

Android的网页制作非常锁定,即你不能访问到私人领域的帆布和/或布局,它在内部使用AndroidActivity.

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

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

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

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