我想在我的原生Android页面控件中使用Xamarin.Form控件。 在我的Android原生页面中有没有办法在我的原生Android片段或LinearLayout中加载Xamarin.Form页面?
根据Xamarin的说法,这是可能的。 但我找不到如何实现这一目标。
有几件事正在讨论中,所以请耐心等待:
根据我的理解,图片摘录:
"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
您可能正在寻找自定义渲染器。
View
的类MyView(或其他一些合适的类,如果您有子视图等,请说ContentView) ViewRenderer
的渲染器类MyViewRenderer [assembly: ExportRenderer (typeof(MyView), typeof(MyViewRenderer))]
之前 ,将该属性添加到该类,指示它是渲染器 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应用程序中的另一个启动此新活动。